Зачем использовать делегат Dispatcher.Invoke ((ThreadStart) ... в WPF? - PullRequest
0 голосов
/ 17 ноября 2011

Я обычно использую Dispatcher.Invoke, когда мне нужно получить доступ к некоторым элементам пользовательского интерфейса из фонового потока.Недавно мне пришлось изменить другие письменные источники, и я увидел, что те же задачи он выполняет с помощью таких конструкций, как:

Dispatcher.Invoke((ThreadStart)delegate
            {
              //some code that uses controls from UI
            });

Когда мне следует использовать такой код вместо Dispatcher.Invoke/BeginInvoke и почему?

1 Ответ

6 голосов
/ 17 ноября 2011

То, что действительно использует Dispatcher.Invoke - это не "вместо".Этот код просто использует ThreadStart как способ сообщить компилятору тип делегата для преобразования анонимного метода в.

Это эквивалентно:

ThreadStart tmp = delegate
{
    // Code
};
Dispatcher.Invoke(tmp);

Лично я бы использовал Action вместо ThreadStart здесь, поскольку вы на самом деле не запускаете поток, но это довольно произвольный выбор.Не обращайте внимания на тот факт, что он называется ThreadStart - это просто делегат с пустым типом возврата и без параметров.

РЕДАКТИРОВАТЬ: причина, по которой вы должны указать a Тип делегата заключается в том, что компилятор не может преобразовать анонимную функцию (т. е. анонимный метод или лямбда-выражение) в просто Delegate, который является типом аргумента Dispatcher.Invoke.

.написать метод расширения:

public static void InvokeAction(this Dispatcher dispatcher, Action action)
{
    dispatcher.Invoke(action);
}

Затем вы можете использовать:

foo.Dispatcher.InvokeAction(() => { /* stuff */ });

, и компилятор знает, как преобразовать лямбда-выражение в Action.

...