Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# windows窗体中访问设备数据的响应UI_C#_Multithreading_User Interface - Fatal编程技术网

C# windows窗体中访问设备数据的响应UI

C# windows窗体中访问设备数据的响应UI,c#,multithreading,user-interface,C#,Multithreading,User Interface,我有一个C#windows窗体应用程序,可以从连接的设备查询数据。我目前启动一个System.Timer.Timer,设置为每20毫秒启动一次,并从连接的工具中获取数据。这很好,但用户界面对数据计数的更新、数据上计算的最终结果等没有响应。我还将数据显示在两个OpenGL窗口中,因此会有很多事情发生 _timer1 = new System.Timers.Timer{ Interval = Convert.ToDouble(txtElapse.Text), Enabled = true};

我有一个C#windows窗体应用程序,可以从连接的设备查询数据。我目前启动一个System.Timer.Timer,设置为每20毫秒启动一次,并从连接的工具中获取数据。这很好,但用户界面对数据计数的更新、数据上计算的最终结果等没有响应。我还将数据显示在两个OpenGL窗口中,因此会有很多事情发生

_timer1 = new System.Timers.Timer{
Interval = Convert.ToDouble(txtElapse.Text),
Enabled = true};    
_timer1.Elapsed += Timer1Elapsed;
然后我使用然后使表单无效,以便为OpenGL重新绘制,这是执行所有计算等的地方


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

一个好的经验法则是,任何需要更长时间或可能需要更长时间的都应该是异步的。多线程的选项取决于所使用的目标框架,因为在.NET2-3.5中有标准的异步模式(开始、结束、调用、回调),但在.NET4中有任务并行库

BackgroundWorker是异步操作的包装器。所以它适合你的手术。考虑到你说你已经对它做了大量的研究,我就不在这里详述了

您还可以剥离线程并对UI进行修改

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
    }
}
您也可以使用