簡體   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