gpt4 book ai didi

wpf - WPF 中的多线程 UI

转载 作者:行者123 更新时间:2023-12-03 12:56:10 29 4
gpt4 key购买 nike

  • 我有两个 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,每个线程都有自己的消息队列,当我点击“取消”按钮时,这条消息应该立即排队并由后台线程处理,但根据我在本地的测试,这是不正确的,后台线程从不处理按钮点击事件...

    有什么想法吗?

    顺便说一句,我认为有两种方法可以克服上述问题,一种是使用 Application.DoEvents,另一种是利用 Dispatcher.Invoke。但是我仍然很好奇为什么后台线程不能立即处理消息。提前致谢。

    最佳答案

    一般来说,拥有两个用户界面线程通常是一个坏主意,而且完全没有必要。

    您通常只有一个用户界面线程,只需将实际计算工作移到后台线程中即可。用户界面更新将根据需要被编码(marshal)回主线程。 BackgroundWorker在许多情况下,这非常有用。

    至于取消,这通常最好使用框架来处理 cooperative cancelation model这是围绕 CancellationTokenSource 建立的和 CancellationToken .这些在设计时考虑到了跨多个线程的使用,并自动处理所需的适当内存屏障。

    关于wpf - WPF 中的多线程 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16342332/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com