我在C#中遇到接口延迟问题。
由于我还在学习,请在解释时保持耐心。
我已将问题缩小到我的计时器对象。
基本上我的程序通过TCP / IP套接字查询设备并将其输出到屏幕上的文本框。
现在我每秒都在设备上查询数据,这需要将一些逻辑隐藏在计时器对象中,以下是在ticks之间发生的事情:
这可能是在事件处理程序中进行了太多的处理吗?每次我在轮询会话期间尝试移动窗口,即当计时器运行时,我的输入延迟非常糟糕。
答案 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处理程序时,都会导致线程之间的上下文切换。这涉及到一些开销(你可以做任何事情都没有),你上下文切换的频率越高,你的表现就越慢。