从另一个线程读取Checkbox状态

Dav*_*eer 3 c# wpf multithreading

我试图从WPF中的BackgroundWorker中读取复选框的值:

这不起作用:

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

无法将匿名方法转换为委托类型'System.Threading.ThreadStart',因为块中的某些返回类型不能隐式转换为委托返回类型

编辑 - 这是HB的答案,使用委托而不是lambda表达,我发现它更具可读性

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

H.B*_*.B. 6

改为分配变量,然后你不需要return.

bool? isSleepChecked;
checkBoxSleep.Dispatcher.Invoke(new Action(
    () => isSleepChecked = checkBoxSleep.IsChecked));
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用具有返回值的委托(例如a Func<T>):

bool? isSleepChecked = checkBoxSleep.Dispatcher.Invoke(new Func<bool?>(
                            () => checkBoxSleep.IsChecked));
Run Code Online (Sandbox Code Playgroud)

(在.NET 4.5之前需要返回类型转换)