【问题标题】:Windows Forms async awaitWindows 窗体异步等待
【发布时间】:2022-01-19 12:35:42
【问题描述】:

当我使用 winforms 应用程序时,我需要每 5 分钟检查一次数据更新。我需要向少数服务发送请求,然后获取响应并更新数据库中的数据。在另一个线程(或任务?)上进行的最佳实践是什么?程序不应减速。 我尝试用计时器制作: 程序运行时初始化定时器

public class Timer
{

    private System.Timers.Timer timer;
    private void InitTimer()
    {
        timer = new System.Timers.Timer(4000);
        timer.Elapsed += ElapsedTime;
        timer.Enabled = true;
    }

    private void ElapsedTime()
    {
      //send request and update data
    }
}

【问题讨论】:

标签: c# multithreading winforms async-await


【解决方案1】:

你这样做的方式会很好。 documentation for Sytem.Timers.Timer 说:

如果SynchronizingObject 属性为null,则在ThreadPool 线程上引发Elapsed 事件。

SynchronizingObject 属性默认为null,因此您的Elasped 事件将在 ThreadPool 线程上运行,而不是在 UI 线程上运行。这意味着它不会阻止您的应用程序响应用户输入。

如果ElapsedTime() 的运行时间可能比您的时间间隔更长,并且您不希望事件重叠,那么您可以将AutoReset 设置为false 并在@987654335 结束时手动重置它@。只需确保所有内容都包含在 try/catch 块中,否则如果出现异常,计时器将不会重置。下面的代码显示了它的外观。

您无需在此处的任何地方使用async/await。由于它不会在 UI 线程上运行,因此使用异步代码对您没有任何帮助。在桌面应用程序中,有一个单独的(非 UI)线程等待并不是什么大问题。

public class Timer
{

    private System.Timers.Timer timer;
    private void InitTimer()
    {
        timer = new System.Timers.Timer(4000);
        timer.Elapsed += ElapsedTime;
        timer.AutoReset = false;
        timer.Enabled = true;
    }

    private void ElapsedTime()
    {
        try {
            //send request and update data
        }
        catch (Exception e)
        {
            //log the error
        }
        finally
        {
            //start the timer again
            timer.Enabled = true;
        }
    }
}

【讨论】:

  • "在桌面应用程序中,有一个单独的(非 UI)线程等待并不是什么大问题。" -- 虽然这是真的,但使用 async/await增加了ThreadPool 的可用性,并且在性能或便利性方面没有明显的成本(假设程序员已经熟悉该技术),所以我不同意避免它的建议。
  • @TheodorZoulias 通常我会同意,但是在事件处理程序中使用异步是很棘手的,因为它是void。你仍然可以让它异步,但它让事情变得有点复杂,我只是不认为这是值得的。但对每个人来说都是他们自己的。
  • Gabriel AFAIK async void 的目的是使异步事件处理程序成为可能。因此,将其用于预期目的应该没问题。在Elapsed 处理程序中使用async 的结果可能是(我还没有测试过)任何未处理的异常都会传播,而不是被吞没,这是这个棘手事件的"subject to change" 行为。
  • @TheodorZoulias 同意。无论哪种方式都可以。
猜你喜欢
  • 1970-01-01
  • 2017-12-07
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2016-07-07
相关资源
最近更新 更多