【发布时间】:2020-11-17 04:39:04
【问题描述】:
我想知道实际问题的最佳解决方案是什么。 我没有在这个小项目中使用任何线程。
这是一个简单的 UI 在固定计时器上从串口轮询数据。
数据经过分析、过滤,然后显示在折线图上。
当表单在桌面上移动时,除了数据轮询“挂起”(即没有被执行、没有错误或任何东西)之外,一切都工作正常。
我不一定需要在移动表单时更新图表,但我至少希望计时器在移动时仍然滴答作响(以便数据轮询继续)。
我的计时器声明如下:
private System.Windows.Forms.Timer timer1;
我自己没有定义任何线程,但我的理解是计时器滴答是在单独的线程上发生的。对吗?
我正在处理这样的计时器滴答事件。
private void timer1_Tick(object sender, EventArgs e)
{
if (chkBoxPosition.Checked)
{
tBoxPosition.Text = ExecuteCommand("r 1\n", tBoxPosition.Text, false, false);
Axis.position = TryParseDouble(Axis.position, tBoxPosition.Text);
}
}
我在这次活动中有更多东西(图表)。
它工作得很好,但是当我在桌面上拖动 UI winform 时,它会暂时“冻结”控件,直到我放开 UI。它不会崩溃或任何事情,只是在我移动窗口时不会刷新。
就控件而言并不是什么大不了的事,但是,我刚刚意识到整个线程或计时器也挂起,至于我按住鼠标按钮拖动窗口的整个时间似乎什么都没有发生。
【问题讨论】:
-
你能发布一些代码吗?否则,恐怕您的问题可能会被关闭......
-
我会在表单上放置一个 BackgroundWorker 控件,并通过无限循环和 Sleep() 调用在 DoWork() 处理程序中进行轮询。更新数据后,使用 ReportProgress() 触发 ProgressChanged() 事件,这样可以安全地更新折线图。
-
不要在 UI 线程中做非 UI 工作。这样做可以让您的后台工作阻止 UI 线程更新,并允许 UI 更新阻止您的后台工作运行。
-
不,
System.Windows.Forms.Timer在 UI 线程上运行。
标签: c# multithreading winforms timer