在能够处理事件 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();
}

这真的是一个非常简单的方法,我不知道上次尝试这种方法时出了什么问题。

在能够处理事件 c# 时等待的方法

您可以更改"主线程"以对计时器事件执行操作。然后,您可以添加逻辑以在阻止任务正在运行时禁用这些计时器事件。然后,更改按钮,以便它们更新全局变量或将所需的操作添加到队列中,而不是直接触发其任务。

使用表单计时器的非常基本的示例:

    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
    }