How to get notification that a System.Threading.Tasks.Task has completed
Task task = Task.Run ( () => { Thread.Sleep ( 2000 ); } );
task.GetAwaiter ().OnCompleted ( () =>
{
MessageBox.Show ( "the task completed in the main thread", "");
} );
I suspect you're looking for Task.ContinueWith
(or Task<T>.ContinueWith
). These basically say, "When you've finished this task, execute this action." However, there are various options you can specify to take more control over it.
MSDN goes into a lot more detail on this in "How to: Chain Multiple Tasks With Continuations" and "Continuation Tasks".
In modern C#, one no longer needs to call ContinueWith()
explicitly. An alternative to the original accepted answer would be to simply create an async
method that await
s the Task
in question, and does whatever it wants when the Task
completes.
For example, suppose you want to raise an event called TaskCompleted
when the Task
completes. You would write a method like:
async Task RaiseEventWhenTaskCompleted(Task task)
{
await task;
TaskCompleted?.Invoke(this, EventArgs.Empty);
}
To "register" the wait, just call the above method. Add exception handling as desired, either in the method above, or in some code that will eventually observe the Task
returned by the above method.