您好,登錄后才能下訂單哦!
本篇文章為大家展示了C#中異步調用的原理是什么,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
C#異步調用是什么呢?具體的內容又是什么呢?讓我們開始C#異步調用的學習吧
計算機中有些處理比較耗時。調用這種處理代碼時,調用方如果站在那里苦苦等待,會嚴重影響程序性能。例如,某個程序啟動后如果需要打開文件讀出其中的數據,再根據這些數據進行一系列初始化處理,程序主窗口將遲遲不能顯示,讓用戶感到這個程序怎么等半天也不出來,太差勁了。借助C#異步調用可以把問題輕松化解:把整個初始化處理放進一個單獨線程,主線程啟動此線程后接著往下走,讓主窗口瞬間顯示出來。等用戶盯著窗口犯呆時,初始化處理就在背后悄悄完成了。程序開始穩定運行以后,還可以繼續使用這種技巧改善人機交互的瞬時反應。用戶點擊鼠標時,所激發的操作如果較費時,再點擊鼠標將不會立即反應,整個程序顯得很沉重。借助C#異步調用處理費時的操作,讓主線程隨時恭候下一條消息,用戶點擊鼠標時感到輕松快捷,肯定會對軟件產生好感。
C#異步調用用來處理從外部輸入的數據特別有效。假如計算機需要從一臺低速設備索取數據,然后是一段冗長的數據處理過程,采用同步調用顯然很不合算:計算機先向外部設備發出請求,然后等待數據輸入;而外部設備向計算機發送數據后,也要等待計算機完成數據處理后再發出下一條數據請求。雙方都有一段等待期,拉長了整個處理過程。其實,計算機可以在處理數據之前先發出下一條數據請求,然后立即去處理數據。如果數據處理比數據采集快,要等待的只有計算機,外部設備可以連續不停地采集數據。如果計算機同時連接多臺輸入設備,可以輪流向各臺設備發出數據請求,并隨時處理每臺設備發來的數據,整個系統可以保持連續高速運轉。編程的關鍵是把數據索取代碼和數據處理代碼分別歸屬兩個不同的線程。數據處理代碼調用一個數據請求異步函數,然后徑自處理手頭的數據。待下一組數據到來后,數據處理線程將收到通知,結束 wait 狀態,發出下一條數據請求,然后繼續處理數據。
C#異步調用時,調用方不等被調方返回結果就轉身離去,因此必須有一種機制讓被調方有了結果時能通知調用方。在同一進程中有很多手段可以利用,筆者常用的手段是回調、event 對象和消息。
回調方式很簡單:調用異步函數時在參數中放入一個函數地址,異步函數保存此地址,待有了結果后回調此函數便可以向調用方發出通知。如果把異步函數包裝進一個對象中,可以用事件取代回調函數地址,通過事件處理例程向調用方發通知。
event 是 windows 系統提供的一個常用同步對象,以在異步處理中對齊不同線程之間的步點。如果調用方暫時無事可做,可以調用 wait 函數等在那里,此時 event 處于 nonsignaled 狀態。當被調方出來結果之后,把 event 對象置于 signaled 狀態,wait 函數便自動結束等待,使調用方重新動作起來,從被調方取出處理結果。這種方式比回調方式要復雜一些,速度也相對較慢,但有很大的靈活性,可以搞出很多花樣以適應比較復雜的處理系統。
借助 windows 消息發通知是個不錯的選擇,既簡單又安全。程序中定義一個用戶消息,并由調用方準備好消息處理例程。被調方出來結果之后立即向調用方發送此消息,并通過 wparam 和 lparam 這兩個參數傳送結果。消息總是與窗口 handle 關聯,因此調用方必須借助一個窗口才能接收消息,這是其不方便之處。另外,通過消息聯絡會影響速度,需要高速處理時回調方式更有優勢。
如果調用方和被調方分屬兩個不同的進程,由于內存空間的隔閡,一般是采用 windows 消息發通知比較簡單可靠,被調方可以借助消息本身向調用方傳送數據。event 對象也可以通過名稱在不同進程間共享,但只能發通知,本身無法傳送數據,需要借助 windows 消息和 filemapping 等內存共享手段或借助 mailslot 和 pipe 等通信手段。
C#異步調用原理并不復雜,但實際使用時容易出莫名其妙的問題,特別是不同線程共享代碼或共享數據時容易出問題,編程時需要時時注意是否存在這樣的共享,并通過各種狀態標志避免沖突。windows 系統提供的 mutex 對象用在這里特別方便。mutex 同一時刻只能有一個管轄者。一個線程放棄管轄權后,另一線程才能接管。當某線程執行到敏感區之前先接管 mutex,使其他線程被 wait 函數堵在身后;脫離敏感區之后立即放棄管轄權,使 wait 函數結束等待,另一個線程便有機會光臨此敏感區。這樣就可以有效避免多個線程進入同一敏感區。
由于C#異步調用容易出問題,要設計一個安全高效的編程方案需要比較多的設計經驗,所以***不要濫用C#異步調用。同步調用畢竟讓人更舒服些:不管程序走到哪里,只要死盯著移動點就能心中有數,不至于象C#異步調用那樣,總有一種四面受敵、惶惶不安的感覺。必要時甚至可以把異步函數轉換為同步函數。方法很簡單:調用異步函數后馬上調用 wait 函數等在那里,待異步函數返回結果后再繼續往下走。
上述內容就是C#中異步調用的原理是什么,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。