Чтение статуса флажка из другого потока - PullRequest
3 голосов
/ 13 февраля 2012

Пытаюсь прочитать значение флажка из BackgroundWorker в WPF:

Это не работает:

bool? isSleepChecked = checkBoxSleep.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate{ return checkBoxSleep.IsChecked;});

Невозможно преобразовать анонимный метод в делегировать тип 'System.Threading.ThreadStart ', поскольку некоторые типы возвращаемых данных в блоке неявно не преобразуются в тип возврата делегата

РЕДАКТИРОВАТЬ - Здесь приведен ответ HB, выраженный с использованием делегата вместо лямбды, который, на мой взгляд, немного более читабелен

bool? isSleepChecked = (bool?)checkBoxSleep.Dispatcher.Invoke(new Func<bool?>(delegate { return checkBoxSleep.IsChecked; }));

Ответы [ 2 ]

6 голосов
/ 13 февраля 2012

Вместо этого назначьте переменную, тогда вам не нужно return.

bool? isSleepChecked;
checkBoxSleep.Dispatcher.Invoke(new Action(
    () => isSleepChecked = checkBoxSleep.IsChecked));

В качестве альтернативы вы можете использовать делегата с возвращаемым значением (например, a Func<T>):

bool? isSleepChecked = checkBoxSleep.Dispatcher.Invoke(new Func<bool?>(
                            () => checkBoxSleep.IsChecked));

(Требуется тип возврата до .NET 4.5)

2 голосов
/ 13 февраля 2012

Ваш код не будет компилироваться, потому что, пока вы пытаетесь вернуть bool? от своего делегата, ThreadStart имеет тип возврата void.

Самый простой подход в таких случаях, вероятно, заключался бы в том, чтобы захватить переменную isSleepChecked в лямбда-выражении и установить ее непосредственно:

bool? isSleepChecked = null;
checkBoxSleep.Dispatcher.Invoke(new Action(() =>
{ 
    isSleepChecked = checkBoxSleep.IsChecked; 
}), 
    DispatcherPriority.Normal);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...