如何获取System.Threading.Tasks.Task已完成的通知

我目前正在使用.net 4中的新System.Threading.Tasksfunction替换一些新的实现。

我有一个小问题,虽然我可以想到一些解决方案,我想要一些建议,通常是最好的方法,如果我在某处错过了一个技巧。

我需要的是一个任意进程能够启动一个任务然后继续而不是等待任务完成。 不是问题,但是当我需要对任务的结果做一些事情时,我不太确定这样做的最佳方式。

我见过的所有示例都在任务上使用Wait()直到它完成或引用任务上的Result参数。 这两个都将阻止启动Task的线程,这是我不想要的。

我想到的一些解决方案:

  1. 创建一个新线程并在其上启动任务,然后使用Wait()或.Result来阻止新线程并以某种方式将结果同步回调用者,可能需要轮询任务IsCompleted参数。

  2. 有一个’Notify Completed’任务,我可以在完成我要运行的任务后启动,然后引发静态事件或其他事件。

  3. 将委托传递给任务的输入并调用该任务以通知任务已完成。

我可以为所有这些人思考或利弊,但我特别不喜欢在第一个使用Task类的目标之一时必须显式创建一个新线程来启动任务的想法。从直接线程使用中抽象出来。

关于最佳方式的任何想法? 我错过了一些简单的事吗? “完成”事件会不会要求太多了:)? (当然有一个很好的理由没有一个!)

怀疑你正在寻找Task.ContinueWith (或Task.ContinueWith )。 这些基本上说,“当你完成这个任务,执行这个动作。” 但是,您可以指定各种选项以对其进行更多控制。

MSDN在“如何:使用Continuations连接多个任务”和“Continuation Tasks”中详细介绍了这一点。

在现代C#中,不再需要显式调用ContinueWith() 。 原始接受的答案的替代方法是简单地创建一个awaitTaskasync方法,并在Task完成时执行它想要的任何操作。

例如,假设您想在Task完成时引发一个名为TaskCompleted的事件。 你会写一个像这样的方法:

 async Task RaiseEventWhenTaskCompleted(Task task) { await task; TaskCompleted?.Invoke(this, EventArgs.Empty); } 

要“注册”等待,只需调用上面的方法。 根据需要在上面的方法中添加exception处理,或者在最终将观察上述方法返回的Task代码中添加exception处理。

您可以应用任务延续 。

或者, Task实现IAsyncResult ,因此您可以使用该接口的标准方法 (阻塞,轮询或等待其WaitHandle )。