C WPF實現非同步發布事件,避免阻塞

2021-10-09 04:45:43 字數 859 閱讀 3614

wpf中直接使用invoke發布事件時通常都是阻塞的,如果訂閱事件的處理中含有耗時處理以及訂閱事件過多時,會導致介面響應慢,使用者體驗不好,因此可以使用begininvoke來達到非同步的方式。

如,自定義事件:

public delegate void testconsolemsghandler(int test1, int test2, intptr test3);

public event testconsolemsghandler testconsoleevent;

在需要發布事件的地方改為以下方式:

//獲取事件中的多路委託列表

delegate delegarray = testconsoleevent.getinvocationlist();

//遍歷委託列表

foreach (testconsolemsghandler item in delegarray)

又比如自定義事件:

public event eventhandlertestevent;
在需要發布事件的地方改為以下方式:

//獲取事件中的多路委託列表

delegate delegarray = testevent.getinvocationlist();

//遍歷委託列表

foreach (eventhandleritem in delegarray)

一般來說,我們可以呼叫endinvoke來獲取事件發布後,訂閱者返回的事件結果,但這裡可以不呼叫,因為我們不關心訂閱者接收到事件後的結果處理,我們只需要不阻塞的發布事件即可。

C Wpf非同步修改UI,多執行緒修改UI(二)

1.使用定時器非同步修改 這是相對比較簡單的方法 在wpf中定時器使用diapatchertimer,不使用timer原因 在乙個應用程式中,timer會重複生成time事件,而dispatchertimer是乙個整合到了dispatcher佇列中的時鐘,這可以使它被按照指定的時間間隔以指定的pri...

C WPF實現回溯演算法解決八皇后問題

運用c wpf程式設計實現了經典的回溯演算法解決 八皇后問題 程式執行演示結果如下 演算法核心 namespace nqueen 根據皇后數目繪製棋盤函式 暫不使用 皇后數目 public void drawqueen 初始化演算法資料 public void inital int number i...

風火程式設計 python發布celery非同步任務

1.建立celery應用from celery import celery name broker celery backend celery 定義celery任務 def celery job args,kwargs 定義非同步任務 return result 任務邏輯 3.發布celery任務c...