请参阅以下来自StreamWriter
class specification:
“此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的。不保证所有实例成员都是线程安全的。”
据我所知,W3WC进程包含两个线程池,即工作线程和I / O线程。工作线程可以包含自己的许多线程(如果应用程序创建自己的System.Thread
实例)。
警告是否仅与System.Threads
有关,还是与工作线程和I / O线程有关。因为StreamWriter
类的实例变量不是线程安全的,所以这意味着如果多个工作线程访问它会有问题,例如如果两个不同Web客户端上的两个用户同时尝试写入日志文件,那么可以锁定另一个吗?
答案 0 :(得分:3)
如果一个类不是线程安全的,那么你就不能获取该类的实例并从多个线程中使用该实例。它们是System.Threading.Thread
还是ThreadPool
还是Task
还是IIS中的工作线程并不重要。它们都是线程 - 它们都是抢占式多任务处理,而对象处于不期望被抢占的状态。
但是,在您描述的场景中无关紧要。假设两个Web客户端同时尝试连接到服务器,并且您的请求处理程序尝试登录到文件,这意味着您有两个线程可能同时尝试写入该文件。但这不是线程安全问题,因为您不会在两个线程中使用相同的StreamWriter
实例。 (至少,我希望不是 - 如果你有一个静态StreamWriter
实例,你怎么知道何时刷新它并关闭文件?跨线程共享同一个编写器是没有任何意义的。)< / p>
相反,每个线程应该创建自己的StreamWriter
,写入它,然后关闭它。是的,仍然存在并发问题 - 如果第一个线程尚未关闭文件但第二个线程尝试打开文件时,第二个线程将获得文件共享异常,您需要捕获该异常并重试 - 但这是一个文件锁定问题,而不是线程安全问题。