首页 > 解决方案 > 结束时重复调用 C# 任务

问题描述

我有一个必须并行运行代码块的 C# 应用程序。这是其中两个代码块的基本结构。实际上,还会有更多。

private async Task MyFirstTask()
{
   // do stuff

   await FirstTaskImplementation();

   // cleanup
}

private async Task MySecondTask()
{
   // do stuff

   await SecondTaskImplementation();

   // cleanup
}

其中一些代码块将在计时器上运行。有些会重复运行。为了完成,我有以下几点:

Task.Run(() => MyFirstTask());
Task.Run(() => MySecondTask());

完成MyFirstTask后,我想再次运行它。事实上,我想一遍又一遍地运行它,直到程序停止。然而,我想MySecondTask并行运行MyFirstTask. 我的问题是,我如何MyFirstTask重复执行,同时仍然并行MySecondTask

我回顾了几个相关的 SO 问题。我也没有看到Complete一种事件处理程序。所以,就如何实现这一点而言,我有点迷茫。我感谢您的帮助!

标签: c#task-parallel-library

解决方案


其美妙之async/await处在于您可以像编写同步代码一样编写异步代码。您将如何重复同步操作?你可以使用循环。你可以在这里做同样的事情,例如:

private async Task MyFirstTask(CancellationToken token) {
    while (!token.IsCancellationRequested) {
       // do stuff
       await FirstTaskImplementation();
       // cleanup
    }
}

您可以将循环嵌入到当前方法中或将其提升到包装器方法中,但它应该可以工作。

您可以像现在一样继续安排您的任务,尽管您确实应该使用await您的async方法:

CancellationTokenSource cts = new CancellationTokenSource();

Task.Run(async () => await MyFirstTask(cts.Token));
Task.Run(async () => await MySecondTask());

// Request cancellation via `cts` when you want the looping to end.

尽管你没有问过这个问题,但如果你想在每次迭代之间插入一个延迟,你可以简单地await Task.Delay(...)在循环体的末尾放置一个语句。


推荐阅读