非同步代理程式
異步代理程式(或僅代理程式)是應用程式元件,可與其他代理程式異步運作,以解決較大的運算工作。 將代理程式視為具有設定生命週期的工作。 例如,一個代理程式可能會從輸入/輸出裝置讀取數據(例如鍵盤、磁碟上的檔案或網路連線),而另一個代理程式可能會在該數據可供使用時對該數據執行動作。 第一個代理程式會使用訊息傳遞來通知第二個代理程式有更多數據可供使用。 並行運行時間工作排程器提供有效率的機制,讓代理程式能夠合作封鎖和產生,而不需要效率較低的先佔。
Agents Library 會 定義 concurrency::agent 類別來代表異步代理程式。 agent
是一個抽象類,宣告虛擬方法 並行::agent::run。 方法 run
會執行代理程式所執行的工作。 因為 run
是抽象的,您必須在衍生自 agent
的每個類別中實作這個方法。
代理程式生命週期
代理程式有一組生命週期。 並行 ::agent_status 列舉會定義代理程式的各種狀態。 下圖顯示代理程式如何從某個狀態進展到另一個狀態的狀態圖表。 在此圖中,實線代表您從應用程式呼叫的方法;虛線代表從運行時間呼叫的方法。
下表描述 列舉中的每個 agent_status
狀態。
代理程式狀態 | 描述 |
---|---|
agent_created |
代理程式尚未排程執行。 |
agent_runnable |
運行時間正在排程代理程式以執行。 |
agent_started |
代理程式已啟動並正在執行。 |
agent_done |
代理程式已完成。 |
agent_canceled |
代理程式在進入 started 狀態之前已取消。 |
agent_created
是代理程式的初始狀態, agent_runnable
而且 agent_started
是作用中狀態,而 agent_done
agent_canceled
是終端狀態。
使用 concurrency::agent::status 方法來擷取物件的目前狀態agent
。 status
雖然方法是並行安全的方法,但是當方法傳回時status
,代理程式的狀態可能會變更。 例如,當您呼叫 status
方法時,代理程式可能處於 agent_started
狀態,但在方法傳回之後status
移至agent_done
狀態。
方法和功能
下表顯示屬於 agent
類別的一些重要方法。 如需所有 agent
類別方法的詳細資訊,請參閱 代理程序類別。
方法 | 描述 |
---|---|
start | 排程物件以供 agent 執行,並將它設定為 agent_runnable 狀態。 |
run | 執行物件所要執行 agent 的工作。 |
做 | 將代理程式移至 agent_done 狀態。 |
cancel | 如果代理程式未啟動,這個方法會取消代理程序的執行,並將它設定為 agent_canceled 狀態。 |
status | 擷取物件的目前狀態 agent 。 |
等 | agent 等候對象進入 agent_done 或 agent_canceled 狀態。 |
wait_for_all | 等候所有提供 agent 的對象進入 agent_done 或 agent_canceled 狀態。 |
wait_for_one | 等候至少一個提供的 agent 對象進入 agent_done 或 agent_canceled 狀態。 |
建立代理程式對象之後,請呼叫 concurrency::agent::start 方法來排程執行。 運行時間會在排程代理程式並設定為agent_runnable
狀態之後呼叫 run
方法。
運行時間不會管理異步代理程序擲回的例外狀況。 如需例外狀況處理和代理程式的詳細資訊,請參閱 例外狀況處理。
範例
如需示範如何建立基本代理程式型應用程式的範例,請參閱 逐步解說:建立代理程式型應用程式。