在能够处理事件 c# 时等待的方法
本文关键字:等待 方法 处理事件 | 更新日期: 2023-09-27 18:30:40
我正在编写一个使用串行端口对数据进行采样的程序。我尝试实现的是一个等待"循环",我可以等待几分钟,然后从串行端口获取数据。但是,在等待期间,我以2Hz的速率从另一个串行端口获取数据,这是通过timer_Elapsed事件完成的。
我的问题是,作为 c# 的新程序员,我不知道如何实现一个好的、可靠的等待方法。这是必需的,因为我不希望在等待下一个数据样本时执行任何内容(事件除外)。我一直在看的东西是;
private async void wait(int time)
{
var delay = Task.Run(async () =>
{
Stopwatch sw = Stopwatch.StartNew();
await Task.Delay(time);
sw.Stop();
return sw.ElapsedMilliseconds;
});
Debug.Write("Millisecs", delay.Result.ToString());
}
这工作得很差,因为它是非阻塞的,并且以某种方式弄乱了串行通信。
System.Threading.Thread.Sleep(120000);
冻结一切
- 再创建一个线程
这似乎对我没有任何好处,因为我仍然需要冻结主线程才能运行另一个线程,这使得timer_Elapsed事件难以正确处理。
可悲的是,我无法写出更好的东西,我跑了下来;
while (ticks < 150)
{
Application.DoEvents();
}
(int ticks 是 timer_Elapsed 个事件的计数)
根据任务管理器的说法,这迫使我禁用大多数 UI 按钮、表单本身,也让我非常紧张,同时只消耗大约 50% 的 CPU 容量。我只需要有关哪种编码方法适合我的方案类型的建议。
谢谢你的时间!
编辑:
我正在运行仅使用一个窗体作为 UI 的 WinForm 应用。整个代码是一场噩梦,我不会在这里发布。
经过几次尝试,以下代码为我做到了;
public async Void myMethod()
{
await Task.Delay(2000);
doStuff();
}
这真的是一个非常简单的方法,我不知道上次尝试这种方法时出了什么问题。
您可以更改"主线程"以对计时器事件执行操作。然后,您可以添加逻辑以在阻止任务正在运行时禁用这些计时器事件。然后,更改按钮,以便它们更新全局变量或将所需的操作添加到队列中,而不是直接触发其任务。
使用表单计时器的非常基本的示例:
public Action NextAction;
public bool Running;
private void MainForm_Load(object sender, EventArgs e)
{
timer1.Tick += timer1_Tick;
timer1.Interval = 5000;
timer1.Start();
}
void timer1_Tick(object sender, EventArgs e)
{
if (!Running && NextAction != null)
{
Running = true;
NextAction();
Running = false;
}
}
void button1_Click(object sender, EventArgs e)
{
NextAction = () => TaskMethod();
}
void TaskMethod()
{
// do something
}