2 回答

TA貢獻1817條經驗 獲得超14個贊
漢斯做到了。SynchronizationContext
從技術上講await
,您的代碼正在中斷,因為. 但即使你寫了一個,也不夠。
這種方法的一個大問題是您的 STA 線程沒有啟動。STA 線程必須抽取 Win32 消息隊列,否則它們就不是 STA 線程。SetApartmentState(ApartmentState.STA)
只是告訴運行時這是一個 STA 線程;它不會使其成為 STA 線程。您必須泵送消息才能使其成為 STA 線程。
您可以自己編寫消息泵,但我不知道有誰敢這樣做。大多數人從WinForms(la Hans 的回答)或WPF安裝消息泵。也可以使用UWP 消息泵來執行此操作。
使用提供的消息泵的一個很好的副作用是它們還提供一個SynchronizationContext
(例如WinFormsSynchronizationContext
/ DispatcherSynchronizationContext
),因此await
可以自然地工作。此外,由于每個 .NET UI 框架都定義了一個“運行此委托”的 Win32 消息,因此底層 Win32 消息隊列也可以包含您想要排隊到您的線程的所有工作,因此顯式隊列及其“運行程序”代碼不再是必要的。

TA貢獻2003條經驗 獲得超2個贊
因為在await Task.Delay()語句之后,您的代碼在 ThreadPool 線程之一內運行,并且由于 ThreadPool 線程在設計上是 MTA。
var th = new Thread(async () =>
{
var beforAwait = Thread.CurrentThread.GetApartmentState(); // ==> STA
await Task.Delay(1000);
var afterAwait = Thread.CurrentThread.GetApartmentState(); // ==> MTA
});
th.SetApartmentState(ApartmentState.STA);
th.Start();
- 2 回答
- 0 關注
- 144 瀏覽
添加回答
舉報