繁体   English   中英

在连续工作中使用 async/await 或 Task.Run?

[英]Use async/await or Task.Run in a continuous work?

遇到连续长时间运行的工作时,我对是否使用async/awaitTask.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM