Привет, ребята! Многим, наверно, неудобно обращаться к 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)


  1. AngelOfSnow
    26.11.2015 17:07

    Ну вообще, если писать согласно MVVM, тогда привязки, триггеры и т.д. позволяют избегать использования Dispatcher практически всегда.


  1. IL_Agent
    26.11.2015 17:10
    +5

    this.ThreadSafeUpdate(() =>Visibility = Visibility.Hidden);
    

    Dispatcher.BeginInvoke(() =>Visibility = Visibility.Hidden);
    


    И чем первое лучше второго? :)

    И да, при использовании MVVM с Dispatcher сталкиваешься редко, т.к. Binding свойств — потокобезопасен.


  1. Nagg
    26.11.2015 17:20
    +4

    Вы, очевидно, промахнулись с твиттером этой «статьёй» :-).


  1. 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;
            }
        }
    


    1. dordzhiev
      26.11.2015 23:40
      +1

      Хрень какая-то.