Как возвратить значение с Диспетчером. Вызвать?

(1) Предупреждение состоит в том, что classes_probs может быть неопределенным в этой точке. Если tags пусто, первый цикл не выполняется. Вы можете «исправить» это, назначив пустой список перед первым циклом.

(2) Это называется list comprehension. Используйте этот поисковый термин и найдите учебное пособие на предпочитаемом вами уровне написания и примеров.

30
задан MasterMastic 12 June 2013 в 10:23
поделиться

4 ответа

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

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

    }
2
ответ дан toni 27 November 2019 в 23:36
поделиться

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

    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
ответ дан toni 27 November 2019 в 23:36
поделиться
int result = -1;

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

return result;

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

30
ответ дан 27 November 2019 в 23:36
поделиться

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

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

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

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

Источник

1
ответ дан 27 November 2019 в 23:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: