Как вернуть значение с помощью Dispatcher.Invoke? - PullRequest
29 голосов
/ 22 марта 2010

Кто-нибудь знает, как вернуть значение из Dispatcher. Invoke в ? Я хочу вернуть выбранный индекс для ComboBox .

Спасибо!

Ответы [ 5 ]

30 голосов
/ 14 июля 2011

Есть еще один способ, который возвращает значение из Invoke ():

object oIsLoaded = container.Dispatcher.Invoke( new Func<bool> ( () =>
    {
        return container.IsLoaded;
    })
);

И, кстати, есть вероятность, что исходный код (который работает с делегатом) вообще не изменит oIsLoaded;Поэтому я бы предпочел использовать Func<> для возврата значения из функции такого типа.

29 голосов
/ 22 марта 2010
int result = -1;

// this is synchronous
myCombo.Invoke(() => 
{
  result = myCombo.SelectedIndex;
});

return result;

Это, конечно, немного неуклюже. Лучше было бы реализовать INotifyPropertyChanged в вашей виртуальной машине, создать свойство SelectedIndex и привязать к нему свойство SelectedIndex вашего поля со списком. Привязки INPC нечувствительны к потокам (3.5 или 4.0+, я не помню, какие именно), поэтому вы можете без проблем читать и обновлять эти свойства из разных потоков в вашей виртуальной машине.

2 голосов
/ 22 марта 2010

Это мой метод для получения выбранного значения для выпадающего списка, как я могу сказать делегировать возвращаемое значение?

    private object getValueCB(System.Windows.Controls.ComboBox cb)
    {
        object obj;


            if (!cb.Dispatcher.CheckAccess())
            {
                obj = cb.Dispatcher.Invoke(
                  System.Windows.Threading.DispatcherPriority.Normal,
                  new Action(
                    delegate()
                    {
                        obj = cb.SelectedValue;
                    }
                ));

                return obj;
            }
            else
            {
                return obj = cb.SelectedValue;
            }

    }
1 голос
/ 22 марта 2010

Я решил это. Решением является создание пользовательского делегата, который возвращает желаемый тип, подобный этому:

    private object GetValueCB(System.Windows.Controls.ComboBox cb)
    {
        object obj = null;


            if (!cb.Dispatcher.CheckAccess())
            {
                obj = cb.Dispatcher.Invoke(
                  System.Windows.Threading.DispatcherPriority.Normal,
                  (MyDelegate)
                    delegate()
                    {
                        return (obj = cb.SelectedValue);
                    }
                );

                return obj;
            }
            else
            {
                return obj = cb.SelectedValue;
            }

    }

    public delegate object MyDelegate();
1 голос
/ 22 марта 2010

Вы не можете сделать это напрямую, но вы можете сделать это.

Dispatcher.Invoke () фактически возвращает возвращаемое значение от вызываемого вами делегата, поэтому измените ваш делегат соответствующим образом.

Возвращаемое значение

Тип: System.Object Возвращаемое значение из вызываемого делегата или ноль, если у делегата нет возвращаемого значения.

Источник

...