【发布时间】:2015-09-21 17:47:26
【问题描述】:
我目前正在编写一个简单的 WPF 文件复制应用程序,它可以并行复制文件。到目前为止效果很好!它做我想做的一切。操作的核心在以下代码块中:
Parallel.ForEach(Directory.GetFiles(dir).ToList(), file =>
{
_destDetail.CurrOp = string.Format("Copying file: {0}", Path.GetFileName(file));
File.Copy(file, file.Replace(_destDetail.Source, _destDetail.Dest), true);
if (_destDetail.Progress < _destDetail.MaxProgress)
_destDetail.Progress++;
});
我可以实现 ParallelOptions 并将最大线程数也限制为 4,但我想知道是否有办法准确跟踪每个线程在这种情况下会做什么?
例如,假设我有一部分 UI 专用于复制操作的当前“状态”。我想在Grid 中有 4 行,每行都有一个特定的线程以及它当前正在复制的文件。
我知道我可以使用Interlocked 来操作Parallel 循环之外的变量,但是我将如何从Parallel 循环的内部 跟踪特定于线程的变量并使用这些变量使 UI 在哪个线程正在处理哪个文件上保持最新?
【问题讨论】:
-
仅供参考,
File.Copy在Parallel.ForEach内是个坏主意,您应该只在 CPU 绑定工作上使用Parallel.ForEach,对于 IO 绑定工作,它的调度算法将尝试启动任务太多,并且很可能需要比您仅使用单个线程在普通foreach循环中复制文件的时间更长。
标签: c# wpf multithreading parallel-processing