使用async/await或Task.在连续工作中跑步



遇到连续长时间运行的工作时,我不知道是使用async/await还是Task.Run。我读过很多关于异步编程的材料和例子,但大多数都是关于可以预测结局的工作。在我的应用程序中,这是一个带有MVVM的WPF应用程序,该应用程序的主要工作是做无休止的循环,耗时的工作就在其中。工作的主要逻辑如下:

// this method is fired by a command which binds to a button
private void OnStart()
{
Task.Run(() => 
{
var sw = new StopWatch();
sw.Start();
while(IsWorking)
{
TimeConsumingWork();
sw.Stop();
if (sw.ElapsedMiiliseconds >= 1000)
{
Thread.Sleep(1000 - sw.ElapsedMilliseconds);
sw.Restart();
}
}
});
}

我通过切换按钮启动/停止耗时的工作,耗时的工作将长期循环(预计4-30天(。耗时的工作包含相当大的IO绑定,即每秒将一个(6-13cols⨉1000-2000行(数据附加到csv文件中。

那么,有必要将Task.Run的形式更改为async/await吗?似乎使用CCD_ 5而不是CCD_。

那么,是否有必要更改Task。是否运行到async/await窗体?

不,如果你不关心任务的任何返回值,你就不必等待它。你可以将IsWorking设置为false,让线程最终完成

如果您想在完成时确定,您应该保留对Task的引用并等待它。

如果你想在后台线程上运行一些东西;"永远";或者在很长一段时间内,您应该创建一个Thread,或者使用接受TaskCreationOptions.LongRunning:的Task.Factory.StartNew的重载

Task.Factory.StartNew(() => { ... }, 
TaskCreationOptions.LongRunning);

这给了TPL一个在专用线程上运行操作的提示;偷窃;线程池中的一个。

最新更新