共用方式為


非同步代理程式

非同步代理程式(或僅代理 程式 )是應用程式元件,可與其他代理程式非同步運作,以解決較大的運算工作。 將代理程式視為具有設定生命週期的工作。 例如,一個代理程式可能會從輸入/輸出裝置讀取資料(例如鍵盤、磁片上的檔案或網路連線),而另一個代理程式可能會在該資料可供使用時對該資料執行動作。 第一個代理程式會使用訊息傳遞來通知第二個代理程式有更多資料可供使用。 並行執行時間工作排程器提供有效率的機制,讓代理程式能夠合作封鎖和產生,而不需要效率較低的先占。

Agents Library 會 定義 concurrency::agent 類別來代表非同步代理程式。 agent 是一個抽象類別,宣告虛擬方法 並行::agent::run 。 方法 run 會執行代理程式所執行的工作。 因為 run 是抽象的,您必須在衍生自 agent 的每個類別中實作這個方法。

代理程式生命週期

代理程式有一組生命週期。 並行 ::agent_status 列舉會定義代理程式的各種狀態。 下圖顯示代理程式如何從某個狀態進展到另一個狀態的狀態圖表。 在此圖中,實線代表您從應用程式呼叫的方法;虛線代表從執行時間呼叫的方法。

Agent State Diagram.

下表描述 列舉中的每個 agent_status 狀態。

代理程式狀態 描述
agent_created 代理程式尚未排程執行。
agent_runnable 執行時間正在排程代理程式以執行。
agent_started 代理程式已啟動並正在執行。
agent_done 代理程式已完成。
agent_canceled 代理程式在進入 started 狀態之前已取消。

agent_created 是代理程式的初始狀態, agent_runnable 而且 agent_started 是作用中狀態,而 agent_doneagent_canceled 是終端狀態。

使用 concurrency::agent::status 方法來擷取物件的目前狀態 agentstatus雖然方法是並行安全的方法,但是當方法傳回時 status ,代理程式的狀態可能會變更。 例如,當您呼叫 status 方法時,代理程式可能處於 agent_started 狀態,但在方法傳回之後 status 移至 agent_done 狀態。

方法和功能

下表顯示屬於 agent 類別的一些重要方法。 如需所有 agent 類別方法的詳細資訊,請參閱 代理程式類別

方法 描述
start 排程物件以供 agent 執行,並將它設定為 agent_runnable 狀態。
run 執行 物件所要執行 agent 的工作。
將代理程式移至 agent_done 狀態。
cancel 如果代理程式未啟動,這個方法會取消代理程式的執行,並將它設定為 agent_canceled 狀態。
status 擷取物件的目前狀態 agent
agent等候物件進入 agent_doneagent_canceled 狀態。
wait_for_all 等候所有提供 agent 的物件進入 agent_doneagent_canceled 狀態。
wait_for_one 等候至少一個提供的 agent 物件進入 agent_doneagent_canceled 狀態。

建立代理程式物件之後,請呼叫 concurrency::agent::start 方法來排程執行。 執行時間會在排程代理程式並設定為 agent_runnable 狀態之後呼叫 run 方法。

執行時間不會管理非同步代理程式擲回的例外狀況。 如需例外狀況處理和代理程式的詳細資訊,請參閱 例外狀況處理

範例

如需示範如何建立基本代理程式型應用程式的範例,請參閱 逐步解說:建立代理程式型應用程式

另請參閱

非同步代理程式程式庫