Привет, ребята! Многим, наверно, неудобно обращаться к Dispatcher каждый раз, когда нужно обновить контрол с не UI-потока в WPF… в общем, меня это конкретно достало, поэтому написал очень простенький extension-метод, которым и хочу поделиться с вами всеми:
Работает вот так:
static class exMethods
{
async public static void ThreadSafeUpdate(this System.Windows.Controls.Control @this, Action updateLogic)
{
await @this.Dispatcher.BeginInvoke(updateLogic);
}
}
Работает вот так:
this.ThreadSafeUpdate(() => this.Visibility = Visibility.Hidden);
Комментарии (5)
IL_Agent
26.11.2015 17:10+5this.ThreadSafeUpdate(() =>Visibility = Visibility.Hidden);
Dispatcher.BeginInvoke(() =>Visibility = Visibility.Hidden);
И чем первое лучше второго? :)
И да, при использовании MVVM с Dispatcher сталкиваешься редко, т.к. Binding свойств — потокобезопасен.
BalinTomsk
26.11.2015 19:51-4я встречал такую интерпретацию
public static class ExtensionMethods { private static Action EmptyDelegate = delegate() { }; public static void Refresh(this UIElement uiElement) { uiElement.Dispatcher.Invoke(DispatcherPriority.Render, EmptyDelegate); System.Threading.Thread.Sleep(10); } public static DateTime GetDateNow(this DateTime d) { return DateTime.Now; } }
AngelOfSnow
Ну вообще, если писать согласно MVVM, тогда привязки, триггеры и т.д. позволяют избегать использования Dispatcher практически всегда.