Two UI Thread in C# windows Application

前端 未结 3 1630
长发绾君心
长发绾君心 2020-12-18 09:22

How can I implement two ui threads in a C# windows application?

相关标签:
3条回答
  • 2020-12-18 09:30

    Call Application.Run(...) in a new thread and it will open the form with its own message-loop.

    new Thread(() => Application.Run(someForm)).Start();
    
    0 讨论(0)
  • 2020-12-18 09:33

    You need to call Thread.SetApartmentState() to switch the thread to STA before starting it. And pump a message loop to keep any windows created on that thread alive, Application.Run(). Application.ExitThread() will terminate the message loop and cause the thread to exit. Using Run(Form) makes that automatic, just as it does on the main thread.

    Beware however that the user may well have a hard time dealing with the windows you create on that thread. They have no Z-order relationship with the windows in the main thread, the desktop is their parent. That tends to make them easily get lost behind another window, including your own. Awkward workarounds for that are TopMost and pinvoking SetParent().

    0 讨论(0)
  • 2020-12-18 09:56

    This might not be an answer but more of an explanation.

    If two threads were allowed to access the same pixel at the same time - something that would be a consequence of having a multithreaded UI - you would need some sort of synchronization between the threads. If the threads didn't synchronize how should the color of a pixel be determined?

    So we would have to add locking. Locking per pixel is very costly so we'd soon move to locking per control or per window. There you go: by allowing 1 and only 1 thread to access the UI we've implemented locking.

    BTW: replace pixel with control or controltree; it isn't just about pixels it is about shared data whether that be a pixel or a control.

    0 讨论(0)
提交回复
热议问题