2012-02-13 2 views
3

Am пытается прочитать значение флажка из BackgroundWorker в WPF:Чтение Флажок статуса из другого потока

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

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

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

EDIT - Ответ HB выражается с использованием делегата вместо лямбда, который я считаю немного более читаемым

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

ответ

6

Присвоить переменной вместо этого, то вам не нужен return.

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

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

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

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

+0

Спасибо HB (и Дуглас тоже). Очень похожие ответы. Кажется, я предпочитаю ответ Func .. и есть опечатка .. должна быть: new Func

+0

@DaveMateer: вот-вот исправит это :) –

+0

Cheers - поставьте в делетете делегат выше. –

2

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

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

bool? isSleepChecked = null; 
checkBoxSleep.Dispatcher.Invoke(new Action(() => 
{ 
    isSleepChecked = checkBoxSleep.IsChecked; 
}), 
    DispatcherPriority.Normal); 
Смежные вопросы