我正在开发一个在嵌入式设备上运行的WPF应用程序(.NET Standard 4 for embedded)。它有一大堆附加的硬件在我测试时会受到影响,因此我创建了一个DummyHardware接口,除了在运行单元测试时打印日志消息,或者在我的开发PC上独立运行时,它什么都不做。
到目前为止一切顺利。但是:该设备有一个4键键盘,可以进行轮询。我的虚拟键盘类在等待按键时进入无限循环,因为没有键可以按:-)所以我想,“好吧,我会轮询键盘以查看是否1,2,3或按下4“。但我得到了例外
调用线程必须是STA ...
我打电话给Keyboard.IsKeyDown( Key.D1 )
时。键盘轮询在单独的线程中进行(以与其余硬件的通常较慢的串行通信分离)。有关如何进行的任何想法?调用
注意:一种替代方法是跳过虚拟硬件上的“等待密钥”测试,但后来我不知道按下了哪个密钥,以下依赖它的代码将无法正常运行。育。
答案 0 :(得分:4)
您可以将ApartmentState设置为STA。使用Thread.SetApartmentState方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace staThread
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
Thread keyboardThread;
public MainWindow()
{
InitializeComponent();
keyboardThread = new Thread(new ThreadStart(KeyboardThread));
keyboardThread.SetApartmentState(ApartmentState.STA);
keyboardThread.Start();
}
void KeyboardThread()
{
while (true)
{
if (Keyboard.IsKeyDown(Key.A))
{
}
Thread.Sleep(100);
}
}
}
}
答案 1 :(得分:1)
我有一个简单的方法来处理我在UI线程上的运行:
public object RunOnUiThread(Delegate method)
{
return Dispatcher.Invoke(DispatcherPriority.Normal, method);
}
使用来自UI线程的Dispatcher
初始化Dispatcher.CurrentDispatcher
。它可以从任何线程调用,并使用如下:
UiThreadManager.RunOnUiThread((Action)delegate
{
// running on the UI thread
});