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