Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

I am using Dispatcher to switch to UI thread from external like this

Application.Current.Dispatcher.Invoke(myAction);

But I saw on some forums people have advised to use SynchronizationContext instead of Dispatcher.

SynchronizationContext.Current.Post(myAction,null);

What is the difference between them and why SynchronizationContext should be used?.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
404 views
Welcome To Ask or Share your Answers For Others

1 Answer

They both have similar effects, but SynchronizationContext is more generic.

Application.Current.Dispatcher refers to the WPF dispatcher of the application, and using Invoke on that executes the delegate on the main thread of that application.

SynchronizationContext.Current on the other hand returns different implementations of depending on the current thread. When called on the UI thread of a WPF application it returns a SynchronizationContext that uses the dispatcher, when called in on the UI thread of a WinForms application it returns a different one.

You can see the classes inheriting from SynchronizationContext in its MSDN documentation: WindowsFormsSynchronizationContext and DispatcherSynchronizationContext.


One thing to be aware about when using SynchronizationContext is that it returns the synchronization context of the current thread. If you want to use the synchronization context of another thread, e.g. the UI thread, you have to first get its context and store it in a variable:

public void Control_Event(object sender, EventArgs e)
{
    var uiContext = SynchronizationContext.Current;
    Task.Run(() => 
    {
        // do some work
        uiContext.Post(/* update UI controls*/);
    }
}

This does not apply to Application.Current.Dispatcher, which always returns the dispatcher for the application.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...