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 关注
- 176 浏览
添加回答
举报
