[英]Use async/await or Task.Run in a continuous work?
遇到连续长时间运行的工作时,我对是否使用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-20000rows)数据附加到 csv 文件。
那么,是否有必要将Task.Run
改为async/await
形式? 似乎使用async/await
而不是Task.Run
更可取。
那么,是否有必要将 Task.Run 改为 async/await 形式?
不,如果您不关心任务的任何返回值,则不必等待它。 您可以将IsWorking
设置为false
以让线程最终完成。
如果您希望能够确定它何时完成,您应该保留对Task
的引用并等待它。
如果你想运行在后台线程“永远”或很长时间的东西,你应该可以创建一个Thread
,或者使用过载Task.Factory.StartNew
一个接受TaskCreationOptions.LongRunning
:
Task.Factory.StartNew(() => { ... },
TaskCreationOptions.LongRunning);
这为 TPL 提供了在专用线程上运行您的操作的提示,而不是从线程池中“窃取”一个操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.