【发布时间】:2017-01-13 17:59:51
【问题描述】:
我希望我的代码安排任务并立即进行 ForeverRunningTaskAsync。这样,StopForeverRunningTask 在 ForeverRunningTaskAsync 已经进行了 5 秒时执行:
private async void button_Click(object sender, RoutedEventArgs e)
{
Task.Delay(5000).ContinueWith((t) => { StopForeverRunningTask(); }, CancellationToken.None);
await ForeverRunningTaskAsync();
}
运行时一切正常。但是,编译器警告我我错过了 Task.Delay 调用中的“等待”。我不想等待,因为 ForeverRunningTaskAsync 必须立即启动,而不是延迟之后。也许,有一种更优雅的方法来安排任务并立即执行后续代码?或者,我应该忽略警告吗?
编辑: StopForeverRunningTask 实际上可以做任何事情。从答案中,我看到我应该为它提供更抽象的名称。它不一定会停止 ForeverRunningTask 的执行。它可以设置一些标志、获取当前状态等(甚至在 ForeverRunningTask 运行时被多次调用),因此不能使用 CancellationToken。下面建议的 WaitAll 方法回答了我的问题。
【问题讨论】:
-
我不确定我是否理解这个问题,你为什么要使用
await?你没有使用ForeverRunningTaskAsync的结果,也没有在它完成后做任何事情,这不是简单地启动两个不同的任务,一个等待5 秒后再执行,另一个立即启动?跨度> -
我只关注这两个(长期运行的任务和以某种方式控制或检查长期运行的任务流程的任务)。长时间运行的任务之前和之后都有其他任务,长时间运行的任务实际上有结果等等。我只是想做一个尽可能简单的例子,把不那么重要的细节放在一边。
-
@Alex:你不应该使用
ContinueWith。创建一个单独的async方法并改用await。 -
@StephenCleary 恐怕我无法理解这一点。你能扩展一下吗?
-
@Alex:我在我的博客上解释了为什么
ContinueWithis dangerous。而不是使用ContinueWith,您应该有一个单独的async方法:private async Task StopAfterDelayAsync() { await Task.Delay(5000); StopForeverRunningTask(); },称为:var stopper = StopAfterDelayAsync();。
标签: c# async-await