1

我正在开发一个在嵌入式设备上运行的 WPF 应用程序(.NET Standard 4 for Embedded)。它附加了一大堆硬件,在我测试时会妨碍我,所以我创建了一个 DummyHardware 接口,当我运行单元测试或在我的开发 PC 上独立运行时,它除了打印日志消息之外什么都不做。

到目前为止,一切都很好。但是:该设备有一个轮询的 4 键键盘。我的虚拟键盘类在等待按下键时进入无限循环,因为没有键可以按下:-) 所以我想,“好吧,我会轮询键盘看看是 1,2,3 还是4 被按下”。但我得到了例外

调用线程必须是 STA...

当我打电话时Keyboard.IsKeyDown( Key.D1 )。键盘轮询发生在一个单独的线程中(以与其余硬件的通常较慢的串行通信分离)。关于如何进行的任何想法?调用?

注意:一种替代方法是跳过虚拟硬件上的“等待键”测试,但是我不知道按下了哪个键,并且依赖它的以下代码将无法正常运行。玉。

4

2 回答 2

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);
            }
        }
    }
}
于 2013-10-18T11:12:28.143 回答
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
});
于 2013-10-18T11:14:43.497 回答