How to execute code in the GUI Thread?

前端 未结 6 1099
我在风中等你
我在风中等你 2021-01-12 03:56

I have a FileSystemWatcher that react on the Changed event.

I want to open the file, read its content display it in a textbox and hide the popup that has been create

6条回答
  •  不思量自难忘°
    2021-01-12 04:13

    This works well for WPF with MVVM.

    Application.Current.Dispatcher.Invoke(
        () =>
        {
             // Code to run on the GUI thread.
        });
    

    This will not work consistently (it will fail if we are inside a handler for Reactive Extensions):

    Dispatcher.CurrentDispatcher.Invoke(
        () =>
        {
             // Fails if we are inside a handler for Reactive Extensions!
        });
    

    Extra for Experts: The Reason?

    By design, any thread can have a dispatcher thread paired with it, see MSDN: Dispatcher Class.

    If we reference Dispatcher.CurrentDispatcher from any thread, it will actually create a new dispatcher thread, which is separate to the official WPF UI dispatcher thread. When we try to execute code on this newly created dispatcher thread, WPF will throw as it's not the official UI dispatcher thread.

    The solution is to always use Application.Current.Dispatcher.Invoke(), or Application.Current.Dispatcher.BeginInvoke(). See What's the difference between Invoke() and BeginInvoke().


    Update 2020-05-02: It is possible to run a WPF application with multiple WPF UI dispatcher threads. I work with a huge WPF app that is doing this. It is tricky to get it to work, but once it works - it's amazing and the entire app runs an order of magnitude faster as there are multiple UI dispatcher threads. Happy to answer questions on this.


    Tested on:

    • WPF
    • .NET 4.5
    • .NET 4.6
    • .NET 4.61

提交回复
热议问题