【问题标题】:Using TextWriter.Synchronized or having lock in multithreaded file IO - C# WPF .net 4.5使用 TextWriter.Synchronized 或锁定多线程文件 IO - C# WPF .net 4.5
【发布时间】:2014-10-06 17:59:57
【问题描述】:

好的,在多线程系统中有两种方法可以将文本写入文件

哪个更好

第一种情况:有一个静态对象来锁定streamwriter并进行操作

第二种情况有:

     TextWriter twWaitingToBeFetched;
     twWaitingToBeFetched = TextWriter.Synchronized(new StreamWriter(stringPath, true));
     twWaitingToBeFetched.WriteLine(srNewComposedUrl);
     twWaitingToBeFetched.Flush();

现在你认为哪个更好,为什么?

我需要多个线程任务来编写相同的流

C# .net 4.5 - WPF 应用程序

【问题讨论】:

  • 您是否需要多个线程使用同一个流写入文件?或者多个线程可以使用自己的流到同一个文件来追加内容?
  • @Frode 我需要多个线程来写同一个流
  • 两者几乎相同,只是锁定字段不应该是静态的(如果 twWaitingToBeFetched 是实例字段)。静态锁会同步两个不相关的实例。

标签: c# wpf multithreading streamwriter textwriter


【解决方案1】:

如果您使用第二种变体,锁定是隐式和隐藏的。调用代码确实知道有关锁的任何信息。事实上,它可能会错误地假设对WriteLine 的两次调用是原子的,并且会一个接一个地出现在输出中。

使用显式锁定,以便您可以更好地控制哪些操作看起来是原子的。


 TextWriter twWaitingToBeFetched;
 twWaitingToBeFetched = TextWriter.Synchronized(new StreamWriter(stringPath, true));
 twWaitingToBeFetched.WriteLine(srNewComposedUrl);
 twWaitingToBeFetched.Flush();

这不会同步任何东西,因为每个WriteLine 都被分派到一个新的、独立的同步写入器上。您还需要正确处理对象,不要不必要地调用Flush

【讨论】:

  • 如果我不调用flush并且如果应用程序崩溃了我就没有写所有的东西更合适的方法是什么?
  • @MonsterMMORPG 这是 Flush 的有效用例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
相关资源
最近更新 更多