使用排程程式構建反應速度更快的應用程式 續

2021-04-14 14:05:24 字數 3701 閱讀 7909

使用排程程式

dispatcher 類提供了到 wpf 中訊息幫浦的通道,還提供了一種機制來路由供 ui 執行緒處理的工作。這對滿足執行緒關聯要求是必要的,但是對通過 dispatcher 路由的每個工作來說,ui 執行緒都被阻止,因此使 dispatcher 完成的工作小而快非常重要。最好將使用者介面的大塊工作拆分為較小的離散塊,以便 dispatcher 執行。任何不需要在 ui 執行緒上完成的工作應移到其他執行緒上,以便在後台進行處理。

通常,您將會使用 dispatcher 類將工作專案傳送到 ui 執行緒進行處理。例如,如果您想要使用 thread 類在單獨的執行緒上進行一些工作,那麼可以建立乙個 threadstart 委託,在新的執行緒上進行一些工作,**如下:

// the work to perform on another thread
threadstart start = delegate()
;
// create the thread and kick it started!
new thread(start).start();
此**執行失敗,原因是當前沒有在 ui 執行緒上呼叫對 statustext 控制項(一種 textblock)的 text 屬性的設定。當該**嘗試設定 textblock 上的 text 時,textblock 類會在內部呼叫其 verifyaccess 方法以確保該呼叫來自 ui 執行緒。當它確定呼叫是來自不同的執行緒時,則會引發異常。那麼您如何使用 dispatcher 在 ui 執行緒上進行呼叫呢?

dispatcher 類提供了在 ui 執行緒上直接呼叫**的許可權。

// the work to perform on another thread
threadstart start = delegate()
;

// create the thread and kick it started!

new thread(start).start();
**展示了使用 dispatcher 的 invoke 方法來呼叫名叫 setstatus 的方法,從而更改 textblock 的 text 屬性。

該 invoke 呼叫包含三條資訊:要執行的專案的優先順序、說明要執行何種工作的委託,以及任何傳遞給第二個引數中所述委託的引數。通過呼叫 invoke,它將要在 ui 執行緒上呼叫的委託排入佇列。使用 invoke 方法可確保在 ui 執行緒上執行工作之前保持阻止。

作為一種非同步使用 dispatcher 的替代方法,您可以使用 dispatcher 的 begininvoke 方法為 ui 執行緒非同步排隊工作專案。呼叫 begininvoke 方法會返回乙個 dispatcheroperation 類的例項,其中包含有關執行工作專案的資訊,包括工作專案的當前狀態和執行的結果(如果工作專案已完成)。begininvoke 方法和 dispatcheroperation 類的使用如下所示。

// the work to perform on another thread

threadstart start = delegate()}};

// create the thread and kick it started!

new thread(start).start();

與典型的訊息幫浦實現不同,dispatcher 是基於優先順序的工作專案佇列。這就能夠實現更好的響應性,因為重要性更高的工作能夠在重要性較低的工作之前執行。優先順序的本質可通過 dispatchpriority 列舉中指定的優先順序加以例證(如下 所示)。

優先順序說明

非活動工作專案已排隊但未處理。

systemidle

僅當系統空閒時才將工作專案排程到 ui 執行緒。這是實際得到處理的專案的最低優先順序。

僅當應用程式本身空閒時才將工作專案排程到 ui 執行緒。

contextidle

僅在優先順序更高的工作專案得到處理後才將工作專案排程到 ui 執行緒。

後台在所有布局、呈現和輸入專案都得到處理後才將工作專案排程到 ui 執行緒。

輸入以與使用者輸入相同的優先順序將工作專案排程到 ui 執行緒。

已載入在所有布局和呈現都完成後才將工作專案排程到 ui 執行緒。

呈現以與呈現引擎相同的優先順序將工作專案排程到 ui 執行緒。

databind

以與資料繫結相同的優先順序將工作專案排程到 ui 執行緒。

正常以正常優先順序將工作專案排程到 ui 執行緒。這是排程大多數應用程式工作專案時的優先順序。

傳送以最高優先順序將工作專案排程到 ui 執行緒

backgroundworker

現在您對 dispatcher 的工作原理已有所了解,那麼如果得知在大多數情況下都不會使用它,您可能會感到驚訝。在 windows forms 2.0 中,microsoft 引入了乙個用於非 ui 執行緒處理的類來為使用者介面開發人員簡化開發模型。此類稱為 backgroundworker。

backgroundworker _backgroundworker = new backgroundworker();
// set up the background worker events
_backgroundworker.dowork += _backgroundworker_dowork;
backgroundworker.runworkercompleted +=  _backgroundworker_runworkercompleted;
// run the background worker
_backgroundworker.runworkerasync(5000);
// worker method
void _backgroundworker_dowork(object sender, doworkeventargs e)
// completed method
void _backgroundworker_runworkercompleted(object sender, runworkercompletedeventargs e)

else if (e.error != null) 

else

}

**顯示了 backgroundworker 類的典型用法。

backgroundworker 元件與 wpf 的配合非常好,因為在後台它使用了 asyncoperationmanager 類,該類隨之又使用 synchronizationcontext 類來處理同步。在 windows forms 中,asyncoperationmanager 遞交從 synchronizationcontext 類派生的 windowsformssynchronizationcontext 類。同樣,在 asp.net 中,它與 synchronizationcontext 的不同派生(稱為 aspnetsynchronizationcontext)配合使用。這些 synchronizationcontext 派生的類知道如何處理方法呼叫的跨執行緒同步。

在 wpf 中,可用 dispatchersynchronizationcontext 類來擴充套件此模型。通過使用 backgroundworker,可自動應用 dispatcher 來呼叫跨執行緒方法呼叫。好訊息是,由於您可能已經熟悉了這個常見的模式,因此可以繼續在新的 wpf 專案中使用 backgroundworker。

跆拳道反應速度的訓練方法(一)

跆拳道反應速度的訓練方法之一 跆拳道動作反應速度的訓練 即按動作的技術規格要求進行單個或簡易組合動作的訓練。跆拳道反應速度的提高,主要取決於運動員對動作熟練的程度。提高跆拳道動作的反應速度。跆拳道 反應速度的幾種訓練方法 聽教練或同伴發出訊號後進行快速反應。例如,隨同伴擊掌的聲音,迅速做出具體動作如...

跆拳道反應速度的訓練方法(一)

跆拳道反應速度的訓練方法之一 跆拳道動作反應速度的訓練 即按動作的技術規格要求進行單個或簡易組合動作的訓練。跆拳道反應速度的提高,主要取決於運動員對動作熟練的程度。提高跆拳道動作的反應速度。跆拳道 反應速度的幾種訓練方法 聽教練或同伴發出訊號後進行快速反應。例如,隨同伴擊掌的聲音,迅速做出具體動作如...

用純軟體的方式提高WEB伺服器反應速度

用純軟體的方式提高web伺服器反應速度 摘要 本文提出了乙個用純軟體的方式提高web伺服器響應速度的方案,這個方案具有硬體費用低,安全,高效等優點,並且通過與常用方案的比較闡述了其原理和應用前景。abstract php,mysql,apache,freebsd unix 中圖分類號 tp3?文獻標...