非同步代理程式
非同步代理程式(或僅代理 程式 )是應用程式元件,可與其他代理程式非同步運作,以解決較大的運算工作。 將代理程式視為具有設定生命週期的工作。 例如,一個代理程式可能會從輸入/輸出裝置讀取資料(例如鍵盤、磁片上的檔案或網路連線),而另一個代理程式可能會在該資料可供使用時對該資料執行動作。 第一個代理程式會使用訊息傳遞來通知第二個代理程式有更多資料可供使用。 並行執行時間工作排程器提供有效率的機制,讓代理程式能夠合作封鎖和產生,而不需要效率較低的先占。
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
方法。
執行時間不會管理非同步代理程式擲回的例外狀況。 如需例外狀況處理和代理程式的詳細資訊,請參閱 例外狀況處理 。
範例
如需示範如何建立基本代理程式型應用程式的範例,請參閱 逐步解說:建立代理程式型應用程式 。