Dot-Net

延遲調度呼叫?

  • February 22, 2017

在 WPF 中,由於界面更新方式的複雜性,我有時必須在短暫延遲後執行操作。

目前我只是通過以下方式做到這一點:

       var dt = new DispatcherTimer(DispatcherPriority.Send);
       dt.Tick += (s, e) =>
       {
           dt.Stop();
           //DoStuff
       };
       dt.Interval = TimeSpan.FromMilliseconds(200);
       dt.Start();

但是每次都創建一個新的計時器有點難看,而且可能成本太大(?)從性能的角度來看,最好的做法是什麼,即最迅速地執行?以及將上述程式碼重寫為以下內容的好方法是:

       this.Dispatcher.BeginInvoke(new Action(delegate()
       {
           //DoStuff
       }), DispatcherPriority.Send,TimeSpan.FromMilliseconds(200));

Timespan 是延遲,感謝您的任何輸入:)

我不會認為DispatcherTimer是重量級的……為什麼不寫一個擴展方法Dispatcher,允許你使用你想要的語法,並DispatcherTimer在後台使用 a 呢?我個人會呼叫它DelayInvoke而不是BeginInvoke…而且我還將它修復為始終使用Action而不是任意委託…這將使使用 lambda 表達式更容易:

Dispatcher.DelayInvoke(TimeSpan.FromMilliseconds(200), () => { ... 
});

(如果將匿名函式用作方法呼叫中的最後一個參數,我傾向於發現它更具可讀性,但這只是個人喜好。)

鑑於您很可能大部分時間都希望使用毫秒,您也可以使用另一種輔助方法:

Dispatcher.DelayInvokeMillis(200, () => { ... 
});

嘗試的另一種選擇是僅使用現有BeginInvoke方法,但優先級非常低,因此只有在其他所有操作完成後才會呼叫您的委託。在不了解您的具體情況的情況下,很難知道這是否有效——但值得一試。

引用自:https://stackoverflow.com/questions/3740822