4

请参阅以下来自StreamWriter类规范的警告:

“这种类型的任何公共静态(在 Visual Basic 中为共享)成员都是线程安全的。不保证任何实例成员都是线程安全的。”

我了解 W3WC 进程包含两个线程池,即工作线程和 I/O 线程。一个工作线程可以包含许多它自己的线程(如果应用程序创建它自己的System.Thread实例)。

警告是否仅与工作线程和 I/O 线程相关System.Threads或是否与工作线程和 I/O 线程相关,即StreamWriter类的实例变量不是线程安全的,那么这是否意味着如果多个工作线程访问它会出现问题,例如,如果两个不同 Web 客户端上的两个用户尝试同时写入日志文件,然后一个可以锁定另一个吗?

4

1 回答 1

3

如果一个类不是线程安全的,那么您不能获取该类的一个实例并从多个线程中使用该实例。System.Threading.Thread它们是否是 IISThreadPoolTask的工作线程并不重要。它们都是线程——当对象处于不希望被抢占的状态时,它们都是抢占式多任务处理。

不过,在您描述的场景中,这并不重要。假设两个 Web 客户端尝试同时连接到服务器,并且您的请求处理程序尝试记录到一个文件,这意味着您有两个线程可能同时尝试写入该文件。但这不是线程安全问题,因为您不会StreamWriter在两个线程中使用相同的实例。(至少,我希望不会——如果你有一个静态StreamWriter实例,你怎么知道何时刷新它并关闭文件?跨线程共享同一个编写器没有任何意义。)

相反,每个线程都应该创建自己的StreamWriter,写入它,然后关闭它。是的,仍然存在并发问题——如果当第二个线程试图打开文件时第一个线程还没有关闭文件,那么第二个线程会得到一个文件共享异常,你需要捕获那个异常然后重试——但这是文件锁定问题,而不是线程安全问题。

于 2013-10-26T15:50:58.823 回答