InvalidOperationException при использовании Keyboard.Modifiers в задаче - PullRequest
0 голосов
/ 22 июля 2011

Я использую следующий код в моем проекте WPF:

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

и я получу исключение InvalidOperationException:

if (Keyboard.Modifiers == ModifierKeys.Alt)

и он говорит мне:

Вызывающий поток должен быть STA, поскольку для многих компонентов пользовательского интерфейса требуется это.

Я просто не понимаю !! Вроде простой код, но почему?

Ответы [ 2 ]

2 голосов
/ 22 июля 2011

Это многопоточный доступ к управляющему свойству.Вы должны использовать Dispatcher в этом случае.См. эту статью.

1 голос
/ 22 июля 2011

Вам нужно перейти в поток пользовательского интерфейса, чтобы получить доступ к клавиатуре.Попробуйте это:

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