gpt4 book ai didi

c# - .NET Parallel.ForEach、StreamWriter 输出 + 线程安全

转载 作者:太空宇宙 更新时间:2023-11-03 14:26:56 26 4
gpt4 key购买 nike

过去,我使用 ThreadPool.QueueUserWorkItem 从管理器类中生成多个线程。该管理器类订阅这些生成的线程中的事件,该事件在线程工作完成时引发。然后,管理器类可以通过使用 lock 来处理将输出写入文本文件,以防止出现任何竞争情况。

现在我正在使用 Parallel.ForEach 来完成这项工作。以线程安全方式将所有输出写入文本文件的最佳方法是什么?

我的实现的基本大纲:

public class Directory
{
public string Path;

public Directory(string path)
{
Path = path;
}

public void Scan()
{
Parallel.ForEach(new DirectoryInfo(Path).GetDirectories(),
delegate(DirectoryInfo di)
{
var d = new Directory(di.FullName);
d.Scan();
//Output to text file.
});

}
}

我得到的是:

new Directory(@"c:\blah").Scan();

任何能为我指明正确方向的想法都会很棒。我自己有一些,但我正在寻找最佳实践。我读过this post但它不包含任何对我有帮助的解决方案。

最佳答案

使用 EnumerateDirectories (Fx 4) 而不是 GetDirectories。您当前的代码不会非常并行地工作。

<罢工>对于其余部分,这取决于您是否需要按顺序输出。
如果您不关心顺序,您可以简单地锁定输出流(使用辅助对象),写入并继续。无需复杂的事件。
如果你想维持秩序,

将输出推送到队列。当 ForEach 完成时处理队列或启动一个单独的任务(消费者)以尽快写入它。这将是一个典型的生产者/消费者模式。

请注意,通过并行处理,很难保持目录的写入顺序。

关于c# - .NET Parallel.ForEach、StreamWriter 输出 + 线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3696201/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com