在任务中使用Keyboard.Modifiers时出现InvalidOperationException

时间:2011-07-22 09:32:36

标签: c# wpf exception task

我在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组件都需要   此

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

您需要进入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
                        });