是否有一种“标准”的方法来指定任务延续应该在创建初始任务的线程上运行?
目前我有下面的代码-它正在工作,但保持跟踪调度程序和创建第二个动作似乎是不必要的开销。
dispatcher = Dispatcher.CurrentDispatcher;
Task task = Task.Factory.StartNew(() =>
{
DoLongRunningWork();
});
Task UITask= task.ContinueWith(() =>
{
dispatcher.Invoke(new Action(() =>
{
this.TextBlock1.Text = "Complete";
}
});
通过谷歌来到这里,因为我正在寻找一种很好的方法来在任务内部的ui线程上做事情。运行调用-使用下面的代码,您可以使用await再次返回到UI线程。
我希望这能帮助到一些人。
public static class UI
{
public static DispatcherAwaiter Thread => new DispatcherAwaiter();
}
public struct DispatcherAwaiter : INotifyCompletion
{
public bool IsCompleted => Application.Current.Dispatcher.CheckAccess();
public void OnCompleted(Action continuation) => Application.Current.Dispatcher.Invoke(continuation);
public void GetResult() { }
public DispatcherAwaiter GetAwaiter()
{
return this;
}
}
用法:
... code which is executed on the background thread...
await UI.Thread;
... code which will be run in the application dispatcher (ui thread) ...