Dav*_*don 2 c# timer task parallel.foreach
从任务调用以下代码 t = new task(() => StartScanAsync(path)); 但计时器事件没有触发,计时器在 StartTimer 中启动。
private void StartScanAsync(string path)
{
StartTimer();
foreach (string fsPath in Alphaleonis.Win32.Filesystem.Directory.EnumerateFileSystemEntries(path, "*", SearchOption.AllDirectories, true))
{
Alphaleonis.Win32.Filesystem.FileInfo finfo = new Alphaleonis.Win32.Filesystem.FileInfo(fsPath);
fileClass.AddFile(finfo);
// UpdateStatus(fsPath);
UpdateTotalFilesScanned();
TotalFileSize += finfo.Length;
UpdateTotalFileSize(TotalFileSize);
IdentifyFileType.FileType ft = FileType.LoadPathRet(fsPath);
// Application.DoEvents();
}
UpdateStatus("Done Scanning.");
StopTimer();
}
Run Code Online (Sandbox Code Playgroud)
我也尝试了 Parallel.ForEach 并遇到了同样的问题。
以下代码应该启动一个计时器,在一个大集合上运行Parrallel.ForEach,然后停止计时器。但是,计时器事件没有被触发...有什么想法以及如何解决这个问题吗?
StartTimer();
Parallel.ForEach(Alphaleonis.Win32.Filesystem.Directory.EnumerateFileSystemEntries(path, "*", SearchOption.AllDirectories), fsPath =>
{
Alphaleonis.Win32.Filesystem.FileInfo finfo = new Alphaleonis.Win32.Filesystem.FileInfo(fsPath);
fileClass.AddFile(finfo);
UpdateStatus(fsPath);
UpdateTotalFilesScanned();
TotalFileSize += finfo.Length;
UpdateTotalFileSize(TotalFileSize);
// IdentifyFileType.FileType ft = FileType.LoadPathRet(fsPath);
Application.DoEvents();
});
StopTimer();
Run Code Online (Sandbox Code Playgroud)
第一个代码在不在任务中时有效,第二个代码不在任务中运行但仍然不起作用。
所以要澄清:
问题1)为什么计时器(System.Windows.Forms.Timer(我认为))在任务中不触发,并且在围绕Parallel.ForEach时也不触发?
问题 2) 如何在 Parallel.ForEach 任务和 Task<> 任务中每秒引发一个 Tick(以获得每秒扫描的文件数)?
.NET 提供了相当多不同的计时器。您可以在有关比较 .NET Framework 类库中的计时器类的文章中找到详细列表和说明。
问题是您使用的System.Windows.Forms.Timer只能在 UI 线程上使用。在测试场景中,即使对于这样简单的情况,使用此计时器也不起作用:
Task.Factory.StartNew(() =>
{
var timer = new Timer { Enabled = true, Interval = 1000 };
timer.Tick += (s, e) =>
Console.WriteLine("This will never be written to the console!");
});
Run Code Online (Sandbox Code Playgroud)
我假设您创建计时器或在StartTimer或StopTimer方法中修改其属性。即使您在 UI 线程上创建计时器,您实际上也必须在同一 UI 线程上进行Interval设置。Enabled
由于您在不同的任务中使用计时器(通过使用 Task 或 Parallel.For),您必须使用不同的计时器,例如System.Threading.Timer。
您的第二种情况可能是相同的,但是如果不知道使用并行循环调用代码片段的代码,则很难判断。
| 归档时间: |
|
| 查看次数: |
1456 次 |
| 最近记录: |