委託事件+異步執行

近期開發中常常遇到一個需求場景:在某個動做或事件執行完成後刷新、跳轉頁面或打開新頁面。
該需求沒有過多的業務邏輯,看起來也是比較容易實現,實際實現中也遇到了不大不小的毛病,在此總結一下。
 
什麼是委託?

委託。即爲A將接下來處理的代碼委託B執行。
 
什麼場景用委託?

一、多線程數據跨域。這其中包含:線程數據同步,頁面實時刷新(即主線程等待子線程消息)或在某種特殊狀況下用於建立子窗體。
二、實現winform未提供部分事件:例如主窗體下不一樣分頁實時切換,這也次本次記錄的主要功能。
 
什麼是異步?

一般程序需求流程能夠理解爲線性執行,能夠列出時間軸。可是某些狀況下須要程序同時執行A/B兩個動做。程序同時執行多個動做,即爲異步。
 
什麼場景用異步?

跨線程操做。異步多用於刷新界面或切換頁面。即在某個動做執行到必定進度後,在可視頁面中實時通知用戶,但執行該動做的線程沒法跨域操做頁面。
這時可使用委託,執行線程將通知界面線程執行刷新頁面操做。
 
 
此處向下開始分解本次記錄具體功能及實現過程
 
需求分析

需求:在查詢完成後自動跳轉結果頁面。
很簡單,最開始我覺得簡單到不過是一行代碼的事情。我已經打好了算盤。
分析程序:由於程序最開始設計並無該功能,並且爲了實現首次需求中的簡化分頁,因此如今一個子界面中實際擁有三個子頁面。且該子頁面是在結果頁面加載後被加載入主窗體中。因此至此能夠得出如下結論:該頁面(查詢頁面)不能直接操做主窗體。
因而決定才用委託事件,通知結果頁面操做主窗體進行切換。
至此,基本分析結束。
 
構造委託事件

事件委由三個元素組成
一、委託事件(發通知頁面)
二、委託對象(發通知頁面)
三、執行事件(發通知頁面)
四、提供回調事件(被通知頁面)
四、綁定回調(被通知頁面)
1 public delegate void DeleDialogExend(); //委託事件
2 public event DeleDialogExend EventDialogExend; //委託對象
3 public void DialogExend() //執行事件
4 { /**跳轉代碼**/ }
5 public void DialogExend() //回調事件
6 { /**執行代碼**/ }
7 page.EventDialogExend += new ToolByExtendWord.DeleDialogExend(DialogExend); //綁定回調

 

 
此爲第一次寫的委託事件,而且放在手動結束中進行測試。運行成功。
以後繼而移動到結束查詢回調中執行,運行失敗。錯誤爲不可跨線程操做。
 
 
採用異步委託

既然錯誤信息爲禁止跨線程操做,則能夠採起的解決方案有:
一、建立新的線程,注入主窗體執行
二、使用異步委託
第一種方式天然不可取,由於該方案會致使原頁面線程操做權被搶奪,會致使該次操做完成後頁面中止響應。異步委託則是最優方案。
 
既然涉及到跨線程操做,那麼咱們須要分析代碼,肯定被跨越的線程,對將被通知的線程執行異步。
本次需求中,由查詢線程通知頁面線程,應當由頁面線程執行刷新操做,因此應該判斷頁面線程是否被異步委託。
在執行事件中加入如下代碼,此處this指刷新的頁面
1 public void DialogExend()
2 {
3 if (EventDialogExend != null)
4 {
5 if (this.InvokeRequired) this.Invoke(new DeleDialogExend(DialogExend));
6 else EventDialogExend();
7 }
8 }

 

至此,全部分析即實現結束。
相關文章
相關標籤/搜索