1. 程式人生 > >細節:關於非同步呼叫的解決方案

細節:關於非同步呼叫的解決方案

 Net66曾發表過一篇

來說明如何處理後臺執行緒通過非同步方式來更新UI。他的方案非常棒,但是客戶端稍稍複雜了一點,在非常複雜的場景可能會發生問題。我在實際工作中遇到這個問題的時候不是以非同步委託的面目出現的,而是以介面方式實現的,這樣的情況更具有一般性。我通常是在若干個訂閱端(Subscriber)實現這個“訂閱主題”的介面,在一個釋出端(Publisher)實現同樣一個介面,並提供對訂閱者的管理。事實上,在業務層實現這個釋出端的介面是容易的,但在GUI的訂閱端有可能會發生另外一些問題,例如如果業務端與GUI客戶端並不在同一個執行緒中。典型的例子就是通常將“長任務”放到某個後臺執行緒中去執行,在執行過程中可以在任何時候將執行狀態報告給前臺執行緒。顯然,這是一個處理一般性

Observe模式的通用方案。

實現的方法有點變態,和Mixin的原理很相似。在一個AsyncObjectBase的基類或者該基類的派生類上動態實現客戶端介面,同時實現對訂閱者的管理。之所以動態化是為了適應客戶端介面中的任何簽名的方法。

以下是關於AsyncObjectBase的簡單的API

提供了兩個方法來管理訂閱者:

Register(object):新增訂閱者。

Unregister(object):刪除訂閱者。

提供了三個方法來管理髮布狀態:

Disable():關閉釋出。

Enable(object):僅開放指定的訂閱者。

Enable():開放所有的訂閱者。

提供了兩個靜態方法來例項化介面的服務端實現:

AsyncObjectBase GetObject(Type, Type):獲取指定基類、指定介面型別的服務端實現(指定基類必須繼承自AsyncObjectBase)

AsyncObjectBase GetObject(Type):獲取指定介面型別的服務端實現。

AsyncObjectBase派生一個自定義型別來重寫委託指派方法可實現複雜的委託(不僅限於基於System.Windows.Form.Control的實現類)。這三個方法是:

void CheckDelegate(Delegate, object[], out bool)

object ChecjDelegate2(Delegate, object[], out bool)

以上兩個方法都是捕獲委託的,差異是前者實現的委託無返回值,而後者實現的委託有返回值。最後一個引數通知伺服器該委託是否已經被捕獲,以決定是否需要繼續raise這個委託。這是本方案加入自定義委託捕獲的唯一途徑。

bool GetEnabled(object):返回是否需要向指定委託者釋出。

示例實現這樣一個場景:後臺執行緒開啟一個文字檔案,然後一段一段地向多個訂閱者釋出。

有兩點需要說明:

一、示例未實現多介面,當然如果需要的話,改造過程非常簡單。

二、未處理帶返回值的方法的介面,當然如果需要的話,改造過程也非常簡單。

示例下載

相關推薦

微信公眾號支付提示呼叫JSAPI缺少引數timeStamp的解決方案

       在除錯微信公眾號支付時遇到了一個比較詭異的問題,在安卓手機上完全正常,但是同樣的程式碼在蘋果裝置上就不行,iphone和ipad都測試過也是報同樣的錯誤呼叫JSAPI缺少引數:timeStamp。開始列印了一下資料發現生成的json資料中是有時間戳這個引數的,但

Liferay 7Liferay DXP解決方案

lan ptc .html IT body get 解決 http HA 分享是美德,歡迎探討技術 這個作者很厲害呀,寫的博客都是解決很刁鉆問題的。強烈推薦 http://www.liferaysolution.com/2017/06/captcha-recaptcha-w

Server 2012 R2 SceCli 事件ID1202( 0x534)解決方案

錯誤 ppp 51cto nta note image change ask tro 報錯如下:Log Name: Application Source: SceCli Date: 10/28/2018 4:03:07 PM Event ID: 1202 Task Cate

Python問題及解決方案叢集

在《Python程式設計:從入門到實踐》書裡第16章中的一個程式countries.py裡,用到了模組pygal.i18n獲取國別碼,而現在由於pygal已經沒有i18n模組,出現瞭如下錯誤:ModuleNotFoundError: No module named 'pygal.i18n',

Window10升級遇到大坑錯誤程式碼0xc000000e完美解決方案

  昨天忽然升級了,然後並沒有立即重啟更新,因為但是正在工作所以等下班回到家後就是一直提示:檔案:\Windows\system32\winload.efi 錯誤程式碼:0xc000000e!!!       如下圖所示:       

Redis Sentinel叢集Failover解決方案

##redis.conf   ##redis-0,預設為master   port 6379 ##授權密碼,請各個配置保持一致   requirepass 012_345^678-90 masterauth 012_345^678-90 ##暫且禁用指令重新命名   ##rename-command 

搞懂分散式技術11分散式session解決方案與一致性hash

session一致性架構設計實踐 原創: 58沈劍 架構師之路 2017-05-18 一、緣起 什麼是session? 伺服器為每個使用者建立一個會話,儲存使用者的相關資訊,以便多次請求能夠定位到同一個上下文。 Web開發中,web-server可以自動為同

Intellij IDEA設定系列(四)各種亂碼解決方案

  IDEA有分很多種亂碼,選單欄亂碼,console輸出中文亂碼,程式碼亂碼等等,以下提供一些解決方案。 1.設定裡面的快捷鍵設定keymap出現中文,或者中文亂碼 原因:IDEA裡面的jdk選擇的是本地的JDK,而JDK1.5以上的版本是由多國語言的,會選擇作業系統

Android 非同步載入解決方案

from http://www.open-open.com/lib/view/open1345017746897.html Android的Lazy Load主要體現在網路資料(圖片)非同步載入、資料庫查詢、複雜業務邏輯處理以及費時任務操作導致的非同步處理等方面。在介紹An

mysql1103 錯誤解決方案

問題: Host *.*.*.* is not allowed to connect to 解決方案: use mysql; update user set host = '%' where us

【智慧工廠】PPT案例分享智慧工廠解決方案

企業智慧製造整體規劃2017年12月28日,由中國科技自動化聯盟組織的華北地區線下交流活動成功舉

【Android】非同步載入解決方案

Android的Lazy Load主要體現在網路資料(圖片)非同步載入、資料庫查詢、複雜業務邏輯處理以及費時任務操作導致的非同步處理等方面。在介紹Android開發過程中,非同步處理這個常見的技術問題之前,我們簡單回顧下Android開發過程中需要注意的幾個地方。Andr

Cors跨域請求,配置Access-Control-Allow-Origin"*",無效解決方案

由於應用需要跨域請求資料,博主在JDK8、Tomcat7.0的cors可以配置Access-Control-Allow-Origin:"*",但是我按照文件配置以後卻沒有生效,一度懷疑是tomcat或者jdk的問題,最後想起來web.xml是按照從前往後的順序載入的。解

VSTO之旅系列(四)建立Word解決方案

本專題概要 引言 Word物件模型 建立Word外接程式 小結 一、引言 在上一個專題中主要為大家介紹如何自定義我們的Excel 介面的,然而在這個專題中,我將為大家介紹如何用VSTO來建立Word專案,對於Word的VSTO開發和Excel的開發很類似,你同樣也可以為Word自定義

國內使用者使用Android Studio 提示幫助文件 一直顯示fetching documentation解決方案

1,找到   user/.AndroidStudio/config/options下的 jdk.table.xml檔案-->搜尋 http://developer.android.com 位置進

資料庫非同步訪問解決方案

基於前段時間研究資料庫客戶端的非同步訪問,發現 1)  ADO的非同步回撥通知並不能正常工作,相見這裡, 2)  ODBC在3.8版本之前都不支援非同步回撥,詳見這裡 3)  OCI(ORACLE)也並不提供非同步回撥,只支援non-blocking模式,詳見這裡 靠,這是什麼世界啊,大家都不用非同步訪問嗎

tomcat outofmemorypermgen space解決方案

linux機器下更改catalina.sh檔案,在紅色位置加上紅色部分,意思是將JVM方法區的大小設定為128M,最大256M。 # ----- Execute The Requested Command ----------------------------------

Unity 非同步載入 解決方案

遊戲在跳轉大場景介面時,直接切換場景,會產生長時間的卡頓,體驗很不好(還以為遊戲掛掉了) 今天主要研究Unity的非同步載入 新的非同步載入介面 需要名稱空間 using UnityEngine.SceneManagement; 使用 //非同步載入 SceneMa

XTTS系列之一U2L遷移解決方案之XTTS的使用

本系列的定位是對XTTS及相關技術進行深入的學習研究。作為本系列的開篇,本著實用性的原則,我先把一次實際生產環境U2L的遷移實戰實施方案進行提煉簡化,旨在能清楚說明該如何使用XTTS這種解決方案來進行U2L遷移,先達到可以跟著做下來的初級目標,如果有興趣再去深入研究相關細節。 1.XTTS概述 2.遷移準備

SpringBoot學習筆記(十七非同步呼叫

@[Toc] “非同步呼叫”對應的是“同步呼叫”, 在實際開發中,有時候為了及時處理請求和進行響應,我們可能使用非同步呼叫,同步呼叫指程式按照定義順序依次執行,每一行程式都必須等待上一行程式執行完成之後才能執行;非同步呼叫指程式在順序執行時,不等待非同步呼叫的語句返回結果就執行後面的程式。非同步呼