Вспомогательные методы для работы с WPF в диспетчерскую


Я написал следующий небольшой вспомогательный класс для использования в моем WPF приложения. Он приходит время от времени, что мне нужно, чтобы отобразить окно сообщения, или иным образом взаимодействовать с UI из не UI-потоке.

public static class ThreadContext
{
    public static InvokeOnUiThread(Action action)
    {
        if (Application.Current.Dispatcher.CheckAccess())
        {
            action();
        }
        else
        {
            Application.Current.Dispatcher.Invoke(action);
        }
    }

    public static BeginInvokeOnUiThread(Action action)
    {
        if (Application.Current.Dispatcher.CheckAccess())
        {
            action();
        }
        else
        {
            Application.Current.Dispatcher.BeginInvoke(action);
        }
    }
}

Вот небольшой пример, как это можно использовать.

public static MyFunction()
{
    ThreadContext.InvokeOnUiThread(
        delegate()
        {
            MessageBox.Show("Hello world!");
        });
}

Это работает, но объявить делегат, как я, кажется, слишком многословен.

Есть в любом случае, чтобы сделать синтаксис более компактен, в то же время позволяя для произвольной функции должны быть переданы? Есть что-нибудь еще, что вы могли бы предложить для улучшения этого решения, в том числе и совсем иное решение?



13081
3
задан 24 августа 2011 в 09:08 Источник Поделиться
Комментарии
1 ответ

анонимные методы для спасения! Я видел, как кто-то недавно жаловались на то, как этот синтаксис в блоге и нашли его жаль, они были dissimenating этого. Пылесос новый и счастливый путь, чтобы определить делегат, довольно просто:

Сигнатура метода без названия или типы, например:

Sum(int a, int b)

становится:

(a, b)

После этого наш верный лямбда-оператор => , а затем наш метод тела! Это может быть в заявлении блока между нашими верный {} или просто в одной строке таким же образом вы можете поместить одну строку после Если или А и т. д.

Ну и в заключение есть 3 способа создания метода:

Стандарт (должен быть объявлен как уровень ученика):

public int Sum(int a, int b)
{
return a+b;
}

Делегат (могут быть объявлены и инициализированы как метод местное):

delegate(int a, int b)
{
return a+b; // god help me if this syntax is correct, I haven't created a delegate in years
}

Анонимный метод (могут быть объявлены и инициализированы как метод местное):

(a, b) => { return a+b; };

Вернемся к вашему примеру...

ThreadContext.InvokeOnUiThread(
delegate()
{
MessageBox.Show("Hello world!");
});

В анонимном формате способ становится:

ThreadContext.InvokeOnUiThread(() => { MessageBox.Show("Hello world!"); });

Или, если вы предпочитаете:

Action actionToInvokeOnUiThread = () => { MessageBox.Show("Hello world!"); };
ThreadContext.InvokeOnUiThread(actionToInvokeOnUiThread);

4
ответ дан 25 августа 2011 в 12:08 Источник Поделиться