我正在一個新執行緒中運行一個任務,并希望等待它完成。
var a = "logic before the task starts";
await Task.Factory.StartNew(() => MyHugeFunction(_token), _token);
var b = "logic after the task is finished";
它作業得很好,直到我開始在執行緒內部調度:
await Application.Current.Dispatcher.BeginInvoke(new Action(async () =>
{
SomeLogic();
}));
任務本身有效,但等待我正在運行的任務不再有效。一旦我在執行緒中調度,var b 將在主執行緒中分配。
我已經有了一些解決方法,但我只是想知道我是在做一些愚蠢的事情還是這是由其他情況引起的
我正在使用 C# 8.0 和 .Net Framework 4.7.2。
uj5u.com熱心網友回復:
我正在一個新執行緒中運行一個任務,并希望等待它完成。
你想使用Task.Run而不是StartNew。StartNew是一個危險的低級 API,幾乎不應該使用,在少數情況下應該使用它,你應該始終傳遞一個TaskScheduler.
等待 Application.Current.Dispatcher.BeginInvoke(new Action(async () =>
我馬上阻止你。首先,您使用 顯式創建Action委托async,這會產生一個async void方法,應該避免這種情況。接下來,Dispatcher用來做任何事情Invoke或BeginInvoke根本不應該做。
相反,使用Progress<T>型別。這將您的邏輯保留在后臺執行緒中,后臺執行緒可以將物件作為更新傳遞給 UI 執行緒,并且UI 執行緒決定如何在 UI 中顯示這些進度更新。請注意那里很好的關注點分離,每當人們開始使用Dispatcher.
兩者都在 SO 答案StartNew和Dispatcher博客中很常見,但無論如何它們都是次優的解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/416883.html
標籤:
下一篇:動態'when'子句中的N個條件
