Task continuation on UI thread Task continuation on UI thread wpf wpf

Task continuation on UI thread


Call the continuation with TaskScheduler.FromCurrentSynchronizationContext():

    Task UITask= task.ContinueWith(() =>    {     this.TextBlock1.Text = "Complete";     }, TaskScheduler.FromCurrentSynchronizationContext());

This is suitable only if the current execution context is on the UI thread.


With async you just do:

await Task.Run(() => do some stuff);// continue doing stuff on the same context as before.// while it is the default it is nice to be explicit about it with:await Task.Run(() => do some stuff).ConfigureAwait(true);

However:

await Task.Run(() => do some stuff).ConfigureAwait(false);// continue doing stuff on the same thread as the task finished on.


If you have a return value you need to send to the UI you can use the generic version like this:

This is being called from an MVVM ViewModel in my case.

var updateManifest = Task<ShippingManifest>.Run(() =>    {        Thread.Sleep(5000);  // prove it's really working!        // GenerateManifest calls service and returns 'ShippingManifest' object         return GenerateManifest();      })    .ContinueWith(manifest =>    {        // MVVM property        this.ShippingManifest = manifest.Result;        // or if you are not using MVVM...        // txtShippingManifest.Text = manifest.Result.ToString();            System.Diagnostics.Debug.WriteLine("UI manifest updated - " + DateTime.Now);    }, TaskScheduler.FromCurrentSynchronizationContext());