【问题标题】:Long running task with Task.Run使用 Task.Run 长时间运行的任务
【发布时间】:2020-07-20 17:35:28
【问题描述】:

我正在使用 Task.Run 运行无限循环的更新。这是代码:

  Task.Run( async () => {
   
    while(true){
      Thread.Sleep(10000);
      checkForUpdates();
    }
  });

在过去,我曾经为长时间运行的任务编写特殊代码。任务执行的持续时间与 Task.Run 有关系吗?是否内置超时?

【问题讨论】:

  • 不要在异步代码中使用Thread.Sleep。请改用Task.Delay
  • 任务执行的持续时间与 Task.Run 有关系吗?是否有内置超时? 没有,但您可能应该等待它返回的Task。或者持有可以稍后等待的参考。
  • 如果您使用TaskFactory.StartNew,您可以传递TaskCreationOptions.LongRunning,这将确保创建一个新线程来运行任务,而不是从线程池中获取线程。但是,如果您长时间运行的任务的大部分工作是等待下一个循环,请使用await Task.Delay,您应该可以这样。这就是说 imo 一个计时器或一个以设定间隔发射的可观察者更适合您的需求
  • 请澄清您的问题。 checkForUpdates() 是做什么的?你能从生产者-消费者模式中受益吗?或者也许是 TPL 数据流?也许 Rx 可以帮助你?

标签: c# task


【解决方案1】:

不! Task.Run() 没有内置超时。这意味着它将继续运行,直到您手动取消它。你可以通过做这样的事情来实现它。

int timeout = 1000;
var task = SomeOperationAsync(cancellationToken);
if (await Task.WhenAny(task, Task.Delay(timeout, cancellationToken)) == task)
{
    // Task completed within timeout.
    // Consider that the task may have faulted or been canceled.
    // We re-await the task so that any exceptions/cancellation is rethrown.
    await task;

}
else
{
    // timeout/cancellation logic
}  

您可以查看此博客以了解更多信息Crafting a task time-out

【讨论】:

    猜你喜欢
    • 2012-08-13
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    相关资源
    最近更新 更多