【问题标题】:Responsive UI in windows form accessing device dataWindows 窗体中的响应式 UI 访问设备数据
【发布时间】:2012-01-30 19:10:46
【问题描述】:

我有 C# windows 窗体应用程序,它可以从连接的设备查询数据。我目前启动了一个 System.Timer.Timer,它设置为每 20 毫秒触发一次,并从连接的工具中获取数据。这工作正常,但当然 UI 对数据计数的更新、数据计算的最终结果等等变得无响应。我还在几个 OpenGL 窗口中显示数据,所以有很多事情要做。

_timer1 = new System.Timers.Timer{
Interval = Convert.ToDouble(txtElapse.Text),
Enabled = true};    
_timer1.Elapsed += Timer1Elapsed;

然后我使用然后使表单无效来为 OpenGL 重绘,这就是我所有计算等的执行位置。

我的问题是与线程有关,基本上是在什么时候或将线程逻辑应用于哪个对象?计时器本身?如果我这样做,我将无法调试,它就在那里。我已经对 ThreadPools、Backgroundworker、Thread 等进行了大量研究,但没有针对这种情况,因为我认为(错误地?)计时器默认在自己的线程上运行。

【问题讨论】:

    标签: c# multithreading user-interface


    【解决方案1】:

    一个好的经验法则是,任何耗时或可能超过 50 毫秒的东西都应该是异步的。您的多线程选项取决于您使用的目标框架,因为在 .NET 2-3.5 中您有标准的异步模式(开始、结束、调用、回调),但在 .NET 4 中您有任务并行库。

    BackgroundWorker 异步操作的包装器。所以它适合您的操作。考虑到你说你已经对它进行了大量研究,我不会在那里详细说明。

    您还可以分离一个线程并对 UI 执行 thread-safe invokes

    public void StartFooAsync() {
        Thread thread = new Thread(new ThreadStart(DoFooAsync));
        thread.IsBackground = true;
        thread.Start();
    }
    
    private void DoFooAsync() {
        while (m_Running) {
            // Do something
            Thread.Sleep(20ms); // Make the thread wait your 20ms
        }
    }
    

    您也可以使用Task Parallel Library in .NET4

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-13
      • 1970-01-01
      相关资源
      最近更新 更多