具体来说就是将使用TPL生成一个线程Task.Factory.StartNew
:
Task.Factory.StartNew(() => {
File.ReadAllText(@"thisFile.txt");
});
导致任何问题等?MSDN resource上似乎没有提到任何线程安全性
它位于SOAP Web服务环境中。
Ps请,我不想知道在网络环境中使用任务的利弊。我完全知道这些问题,* 请 *,只是理所当然地认为在我的情况下,这种模式是合理的,谢谢。
具体来说就是将使用TPL生成一个线程Task.Factory.StartNew
:
Task.Factory.StartNew(() => {
File.ReadAllText(@"thisFile.txt");
});
导致任何问题等?MSDN resource上似乎没有提到任何线程安全性
它位于SOAP Web服务环境中。
Ps请,我不想知道在网络环境中使用任务的利弊。我完全知道这些问题,* 请 *,只是理所当然地认为在我的情况下,这种模式是合理的,谢谢。
5条答案
按热度按时间gpnt7bae1#
这是很好的-假设没有任何东西同时写入文件,在这种情况下,您可能无法打开文件(或者可能看到部分写入)。
根据documentation of
File
:此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的。任何示例成员都不保证是线程安全的。
(Not可以有任何示例方法,因为它是一个静态类...)
3htmauhk2#
是的,这本身就是线程安全的;然而,它仍然服从文件系统的通常规则:对同一文件的并发访问取决于竞争句柄使用了哪些标志。如果任何句柄将其标记为独占访问,则它将失败,并出现与IO相关的异常。
ukdjmx9f3#
如果不定义所使用的操作,实际上就没有“线程安全”这回事。
如果所有的线程(和进程)都只是以任意一种方式阅读文件,那么读取是安全的。然而,如果一些线程(或另一个进程)正在写入文件,你可能会得到一个半更新的信息,你永远不知道写入是如何组织的。
要获得更可靠的访问,您可以使用
File.ReadAllText
的documentation没有声明任何内容,因此不保证任何有关锁定的内容。ozxc1zmp4#
这里有一个类似于Vlad建议的方法,我使用Read的FileShare选项,这样其他流可以从同一个文件中读取。
zdwk9cvp5#
这个问题我回答得有点晚了。我还想知道它是否是线程安全的。所以,我测试了一下,发现如果所有的读取都来自File.ReadAllText,那么File.ReadAllText是线程安全的。我用以下代码进行了测试: