遇到连续长时间运行的工作时,我不知道是使用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一个在专用线程上运行操作的提示;偷窃;线程池中的一个。