Подтвердить что ты не робот

Как вернуть значение с помощью Dispatcher.Invoke?

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

Спасибо!

4b9b3361

Ответ 1

int result = -1;

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

return result;

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

Ответ 2

Другой способ, который возвращает значение из Invoke():

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

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

Ответ 3

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

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

    }

Ответ 4

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

    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();

Ответ 5

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

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

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

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

Источник