所以这是我上一个问题的延续 - 所以问题是
“构建线程安全的程序的最佳方法是什么,因为它需要将双精度值写入文件。如果通过流写入器保存值的函数被多个线程调用?最好的方法是什么? ?”
我修改了MSDN上找到的一些代码,下面怎么样?这个正确地将所有内容写入文件。
namespace SafeThread
{
class Program
{
static void Main()
{
Threading threader = new Threading();
AutoResetEvent autoEvent = new AutoResetEvent(false);
Thread regularThread =
new Thread(new ThreadStart(threader.ThreadMethod));
regularThread.Start();
ThreadPool.QueueUserWorkItem(new WaitCallback(threader.WorkMethod),
autoEvent);
// Wait for foreground thread to end.
regularThread.Join();
// Wait for background thread to end.
autoEvent.WaitOne();
}
}
class Threading
{
List<double> Values = new List<double>();
static readonly Object locker = new Object();
StreamWriter writer = new StreamWriter("file");
static int bulkCount = 0;
static int bulkSize = 100000;
public void ThreadMethod()
{
lock (locker)
{
while (bulkCount < bulkSize)
Values.Add(bulkCount++);
}
bulkCount = 0;
}
public void WorkMethod(object stateInfo)
{
lock (locker)
{
foreach (double V in Values)
{
writer.WriteLine(V);
writer.Flush();
}
}
// Signal that this thread is finished.
((AutoResetEvent)stateInfo).Set();
}
}
}
Thread
and QueueUserWorkItem
是线程可用的最低 API。除非我最终别无选择,否则我不会使用它们。尝试一下Task
类用于更高级别的抽象。欲了解详情,请参阅我最近关于该主题的博客文章.
您还可以使用BlockingCollection<double>
as a proper生产者/消费者队列,而不是尝试手动构建一个用于同步的最低可用 API.
正确地重新发明这些轮子是非常困难的。我强烈建议使用专为此类需求设计的类(Task
and BlockingCollection
, 再具体一点)。它们内置于 .NET 4.0 框架中,并且可作为 .NET 3.5 的附加组件.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)