非同步編程c
㈠ Python非同步編程02--yield用法
1. 協程: 微線程,是一種用戶態輕量級線程
如圖:在執行A函數的時候,可以隨時中斷,去執行B函數,然後終端繼續執行A函數(可以自動切換)
㈡ 什麼是非同步編程
傳統的同步編程是一種請求響應模型,調用一個方法,等待其響應返回.
非同步編程就是要重新考慮是否需要響應的問題,也就是縮小需要響應的地方。因為越快獲得響應,就是越同步化,順序化,事務化,性能差化。
非同步編程通常是通過fire and forget方式實現,發射事件後即忘記,做別的事情了,無需立即等待剛才發射的響應結果了。(發射事件的地方稱為生產者,而將在另外一個地方響應事件的處理者稱為消費者).非同步編程是一種事件驅動編程,需要完全改變思路,將「請求響應」的思路轉變到「事件驅動」思路上,是一種軟體編程思維的轉變.下面幾種你看參考一下
1、非同步編程模型 (APM) 模式(也稱為 IAsyncResult 模式),其中非同步操作要求 Begin 和 End 方法(例如,非同步寫操作的 BeginWrite 和 EndWrite)。對於新的開發工作不再建議採用此模式。
2、基於事件的非同步模式 (EAP) 需要一個具有 Async 後綴的方法,還需要一個或多個事件、事件處理程序、委託類型和 EventArg 派生的類型。EAP 是在 .NET Framework 2.0 版中引入的。對於新的開發工作不再建議採用此模式。
3、基於任務的非同步模式 (TAP),該模式使用一個方法表示非同步操作的啟動和完成。.NET Framework 4 中引入了 TAP,並且是 .NET Framework 中非同步編程的建議方法。
㈢ 非同步編程的應用:什麼情況下會用到非同步編程
如果數據將在線程間共享。例如正在寫的數據以後可能被另一個線程讀到,或者正在讀的數據可能已經被另一個線程寫過了,那麼這些數據就是共享數據,必須進行同步存取。當應用程序在對象上調用了一個需要花費很長時間來執行的方法,並且不希望讓程序等待方法的返回時,就應該使用非同步編程,在很多情況下採用非同步途徑往往更有效率。
㈣ 如何正確理解.NET 4.5和C#5.0中的async/await非同步編程模式
這個await,其實只是把對老版本C#迭代器的慣用法官方化了。現在很多平台都因為一些原因不得不用舊版本的C#,比如unity,想非同步那隻能通過迭代器來做。
async、迭代器都是語法糖,編譯器會幫你實現成一個狀態機匿名類,實例裡面hold住一些臨時變數,記錄一下當前狀態。根據你寫的yield/await,把一個非同步方法拆成幾個同步block,根據一定規則定期的去MoveNext一下,Current是Task那我就根據你配置的線程上下文決定把這個Task跑在哪個線程上。
那麼用await修飾的非同步方法是在哪個線程中被調用的?為什麼上面這個事件處理方法不會阻塞GUI?
我還看到其它一些描述是說使用async/await非同步模式不會生成新的線程,那麼只在原來已有線程的基礎上面如何做到非同步運行?
題主這個例子這個方法就是在UI線程調用的,並且沒有ConfigureAwait(false),所以會在當前await時捕捉的UI線程上下文執行之後的同步block。
至於為什麼不會阻塞,可以簡單理解為執行了第一個block,碰到Delay(4000),給UI線程的定時器掛一個4000時間之後再調用下一個同步塊的回調。
看題主說的書名像是國產的書,這方面還是看《CLR via C#》或者《Concurrency in C# cookbook》比較好。