我有两个 UI 线程,一个是主线程,另一个是后台线程,其 ApartmentState 为 STA。每个线程创建自己的窗口,后台窗口上有一个“取消”按钮。
主线程有一个功能很忙,需要很长时间才能完成。我希望一旦单击“取消”按钮,主线程应该停止耗时的功能。
以下是主线程中的伪代码:
为了(...) {
//Option A: Application.DoEvents(); //Option B: Dispatcher.Invoke to update UI in background thread if(cancel) return; //Stop the time-consuming function else DoSomething;
}
奇怪的是,“取消”按钮上的点击事件没有被后台线程捕获或处理。IMO,每个线程都有自己的消息队列,当我单击“取消”按钮时,该消息应该立即由后台线程排队并处理,但根据我在本地的测试,这是不正确的,后台线程永远不会处理按钮点击事件...
有什么想法吗?
BTW,我认为有两种方法可以克服上述问题,一种是使用Application.DoEvents,另一种是利用Dispatcher.Invoke。但我仍然很好奇为什么后台线程不能立即处理消息。提前致谢。