[英]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.