繁体   English   中英

Windows Forms 异步等待

[英]Windows Forms async await

当我使用 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
    }
}

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

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

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

如果ElapsedTime()有可能运行的时间比您的时间间隔长,并且您不希望事件重叠,那么您可以将AutoReset设置为false并在ElapsedTime()结束时手动重置它。 只需确保所有内容都包含在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;
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM