如何减少C#中的接口延迟?

时间:2009-08-06 01:11:45

标签: c# .net user-interface timer

我在C#中遇到接口延迟问题。

由于我还在学习,请在解释时保持耐心。

我已将问题缩小到我的计时器对象。

基本上我的程序通过TCP / IP套接字查询设备并将其输出到屏幕上的文本框。

现在我每秒都在设备上查询数据,这需要将一些逻辑隐藏在计时器对象中,以下是在ticks之间发生的事情:

  1. 增加值。
  2. 构造表示要发送到的命令的2个字符串 盒子(封装在一个函数中
  3. 对命令进行编码
  4. 发送命令
  5. 清除字节数组
  6. 收到回复。
  7. 这可能是在事件处理程序中进行了太多的处理吗?每次我在轮询会话期间尝试移动窗口,即当计时器运行时,我的输入延迟非常糟糕。

3 个答案:

答案 0 :(得分:11)

您正在使用的计时器正在Windows消息线程上执行。因此,在轮询运行时,Windows消息队列被阻止。执行太多处理不是问题,大多数时候线程都在等待TCP / IP响应。

要解决此问题,您只需在后台线程上执行工作,然后在UI线程上更新UI。

.NET框架中有一堆不同的计时器以不同的方式工作,您正在使用的计时器在同一个线程上处理计时器事件,其他计时器在后台线程上工作。 Check this article out about the different timers

您也可以使用当前计时器调用BackgroundWorker组件来执行后台线程的工作。这样做的主要好处是BackgroundWorker将在后台线程上完成工作,但会在UI线程上引发工作完成事件,这样就可以轻松更新UI,而不必担心您所在的线程。< / p>

答案 1 :(得分:2)

我认为这是因为你正试图在你的UI线程中工作。让你的计时器在后台工作线程中运行。

答案 2 :(得分:1)

似乎有一些事情正在发生。首先,你可能在你的计时器滴答处理程序中做了太多。你是如何构造字符串和编码命令的?任何这些都可以在tick处理程序之外完成或以任何方式简化(例如,使用String.Format调用)? .NET中实际上有三种不同的计时器,具有不同的分辨率。你在用哪个计时器?

最大的问题是你的间隔是1秒。无论如何,这都是很多处理开销。请记住,在大多数情况下,每次触发间隔并调用tick处理程序时,都会导致线程之间的上下文切换。这涉及到一些开销(你可以做任何事情都没有),你上下文切换的频率越高,你的表现就越慢。