使用键盘时InvalidOperationException.任务中的修饰符

本文关键字:任务 键盘 InvalidOperationException | 更新日期: 2023-09-27 18:03:01

我在我的WPF项目中使用以下代码:

Task.Factory.StartNew(
                        () =>
                        {
                            if (Keyboard.Modifiers == ModifierKeys.Alt) // <- Here
                                Thread.Sleep(1000);                            
                        })
                        .ContinueWith(t =>
                        {
                          // do somthing
                        });

和我将得到InvalidOperationException上:

if (Keyboard.Modifiers == ModifierKeys.Alt)

它告诉我:

调用线程必须是STA,因为许多UI组件需要这个。

我就是不明白!!这似乎是一个简单的代码,但为什么呢?

使用键盘时InvalidOperationException.任务中的修饰符

这是控件属性的跨线程访问。在这种情况下,您应该使用Dispatcher

您需要进入UI线程才能访问键盘。试试这个:

                Task.Factory.StartNew(
                        () =>
                        {
                            if ((bool)Dispatcher.Invoke(DispatcherPriority.Normal, new Func<bool>(() =>
                            {
                                 return Keyboard.Modifiers == ModifierKeys.Alt;
                             })))
                             {
                                Thread.Sleep(1000);                            
                             }
                        })
                        .ContinueWith(t =>
                        {
                          // do somthing
                        });