task 類別 (並行執行階段)
平行模式程式庫 (PPL) task
類別。 task
物件代表可以異步和並行執行的工作,以及並行運行時間中平行演算法所產生的其他工作和平行工作。 成功完成時,會產生 _ResultType
類型的結果。 task<void>
類型的工作不會產生任何結果。 工作可以獨立於其他工作,個別等候及取消。 它也可以使用接續()和聯結(then
)和選擇(when_all
when_any
)模式,與其他工作組成。 當工作物件指派給新的變數時,行為就是 std::shared_ptr
的 ;換句話說,這兩個物件都代表相同的基礎工作。
語法
template <>
class task<void>;
template<typename _ResultType>
class task;
參數
_ResultType
工作產生的結果型別。
成員
公用 Typedefs
名稱 | 描述 |
---|---|
result_type |
此類別物件所產生的結果類型。 |
公用建構函式
名稱 | 描述 |
---|---|
任務 | 已多載。 建構 task 物件。 |
公用方法
名稱 | 描述 |
---|---|
get | 已多載。 傳回這個工作產生的結果。 如果工作不在終止狀態,則呼叫 get 將會等候工作完成。 在 result_type 為 void 的工作上被呼叫時,這個方法不會傳回值。 |
is_apartment_aware | 判斷工作是否解除包裝 Windows 執行階段 IAsyncInfo 介面或是從這類工作繼承而來。 |
is_done | 判定工作是否完成。 |
調度 | 傳回此工作的排程器 |
then | 已多載。 將接續工作加入至此工作。 |
等 | 等候這個工作到達終止狀態。 如果符合所有的工作相依性,而且未經選取供背景工作執行,則 wait 可以執行內嵌工作。 |
公用運算子
名稱 | 描述 |
---|---|
operator!= | 已多載。 判斷兩個 task 物件是否表示不同的內部工作。 |
operator= | 已多載。 將某個 task 物件的內容取代為另一個物件的內容。 |
operator== | 已多載。 判斷兩個 task 物件是否表示相同的內部工作。 |
備註
如需詳細資訊,請參閱 工作平行處理原則。
繼承階層架構
task
需求
標頭: ppltasks.h
命名空間: concurrency
get
傳回這個工作產生的結果。 如果工作不在終止狀態,則呼叫 get
將會等候工作完成。 在 result_type
為 void
的工作上被呼叫時,這個方法不會傳回值。
_ResultType get() const;
void get() const;
傳回值
工作的結果。
備註
如果取消工作,對 get
的呼叫將會擲回 task_canceled 例外狀況。 如果工作發生不同的例外狀況,或例外狀況從前項工作傳播至它,則呼叫 get
將會擲回該例外狀況。
重要
在 通用 Windows 平台 (UWP) 應用程式中,請勿在使用者介面線程上執行的程式代碼中呼叫 concurrency::task::wait 或 get
( wait
callsget
)。 否則,運行時間會 擲回並行::invalid_operation ,因為這些方法會封鎖目前的線程,並可能導致應用程式變得沒有回應。 不過,您可以呼叫 get
方法,以接收工作型接續中前項工作的結果,因為結果會立即可用。
is_apartment_aware
判斷工作是否解除包裝 Windows 執行階段 IAsyncInfo
介面或是從這類工作繼承而來。
bool is_apartment_aware() const;
傳回值
true
如果工作解除包裝 IAsyncInfo
介面或從這類工作遞減,則為 , false
否則為 。
task::is_done 方法 (並行運行時間)
判定工作是否完成。
bool is_done() const;
傳回值
如果工作已完成,則為 True,否則為 false。
備註
如果工作已完成或取消,則函式會傳回 true(無論使用者例外狀況或沒有例外狀況)。
operator!=
判斷兩個 task
物件是否表示不同的內部工作。
bool operator!= (const task<_ResultType>& _Rhs) const;
bool operator!= (const task<void>& _Rhs) const;
參數
_Rhs
要比較的工作。
傳回值
true
如果物件參考不同的基礎工作,則 false
為 ,否則為 。
operator=
將某個 task
物件的內容取代為另一個物件的內容。
task& operator= (const task& _Other);
task& operator= (task&& _Other);
參數
_其他
來源 task
物件。
傳回值
備註
由於 task
的表現就像智慧型指標,因此在複製指派之後,這個 task
物件和 _Other
一樣,都表示相同的實際工作。
operator==
判斷兩個 task
物件是否表示相同的內部工作。
bool operator== (const task<_ResultType>& _Rhs) const;
bool operator== (const task<void>& _Rhs) const;
參數
_Rhs
要比較的工作。
傳回值
true
如果物件參考相同的基礎工作,則 false
為 ,否則為 。
task::scheduler 方法 (並行運行時間)
傳回此工作的排程器
scheduler_ptr scheduler() const;
傳回值
排程器的指標
工作
建構 task
物件。
task();
template<typename T>
__declspec(
noinline) explicit task(T _Param);
template<typename T>
__declspec(
noinline) explicit task(T _Param, const task_options& _TaskOptions);
task(
const task& _Other);
task(
task&& _Other);
參數
T
從中要建構工作的參數的類型。
_參數
從中要建構工作的參數。 如果您使用 Windows 執行階段 應用程式中的工作,這可能是 Lambda、函式對象、task_completion_event<result_type>
物件或 Windows::Foundation::IAsyncInfo。 Lambda 或函式對象應該是相當於 std::function<X(void)>
的類型,其中 X 可以是 、 類型的result_type
task<result_type>
變數,或 Windows 執行階段 應用程式中的 Windows::Foundation::IAsyncInfo。
_TaskOptions
工作選項包括取消語彙基元、排程器等等
_其他
來源 task
物件。
備註
出現 task
的預設建構函式,只是為了讓工作在容器內使用。 只有在指派有效的工作給預設建構的工作之後,您才能使用它。 在預設建構工作上呼叫 時,wait
或 then
之類的get
方法會擲回invalid_argument例外狀況。
從 task_completion_event
建立的工作,會在設定工作完成事件後完成 (並排定其接續作業)。
接受取消語彙基元的建構函式版本,會建立可以透過使用 cancellation_token_source
(語彙基元取得來源) 取消的工作。 在沒有取消語彙基元的情況下建立的工作,無法取消。
從 Windows::Foundation::IAsyncInfo
介面或從傳回 IAsyncInfo
介面的 Lambda 建立的工作,當內含的 Windows 執行階段非同步作業或動作完成時,該工作會到達其終止狀態。 同樣地,從 Lambda 建立的工作會在內部工作到達其終端狀態時傳回 task<result_type>
其終端狀態,而不是當 Lambda 傳回時到達其終端狀態。
task
的行為就像智慧型指標,可透過傳值方式安全傳遞。 它可以由多個執行緒存取,而不需要鎖定。
採用 Windows::Foundation::IAsyncInfo 介面或傳回這類介面的 Lambda 的建構函式多載僅適用於 Windows 執行階段 應用程式。
如需詳細資訊,請參閱 工作平行處理原則。
then
將接續工作加入至此工作。
template<typename _Function>
__declspec(
noinline) auto then(const _Function& _Func) const -> typename details::_ContinuationTypeTraits<_Function,
_ResultType>::_TaskOfType;
template<typename _Function>
__declspec(
noinline) auto then(const _Function& _Func,
const task_options& _TaskOptions) const -> typename details::_ContinuationTypeTraits<_Function,
_ResultType>::_TaskOfType;
template<typename _Function>
__declspec(
noinline) auto then(const _Function& _Func,
cancellation_token _CancellationToken,
task_continuation_context _ContinuationContext) const -> typename details::_ContinuationTypeTraits<_Function,
_ResultType>::_TaskOfType;
template<typename _Function>
__declspec(
noinline) auto then(const _Function& _Func,
const task_options& _TaskOptions = task_options()) const -> typename details::_ContinuationTypeTraits<_Function,
void>::_TaskOfType;
template<typename _Function>
__declspec(
noinline) auto then(const _Function& _Func,
cancellation_token _CancellationToken,
task_continuation_context _ContinuationContext) const -> typename details::_ContinuationTypeTraits<_Function,
void>::_TaskOfType;
參數
_功能
此工作會叫用的函式物件的類型。
_Func
當這個工作完成時執行的接續函式。 這個接續函式必須接受 result_type
或 task<result_type>
的變數做為輸入,其中 result_type
是這個工作所產生結果的類型。
_TaskOptions
工作選項包括取消語彙基元、排程器和接續內容。 前 3 個選項預設會從前項工作繼承
_CancellationToken
要與接續工作產生關聯的取消語彙基元。 所建立不含取消語彙基元的接續工作將會繼承其前項工作的語彙基元。
_ContinuationContext
指定執行接續作業位置的變數。 只有在 UWP 應用程式中使用時,這個變數才有用。 如需詳細資訊,請參閱 task_continuation_context
傳回值
新建立的接續工作。 所傳回工作的結果類型取決於 _Func
傳回哪些項目。
備註
的多載then
會採用傳回 Windows::Foundation::IAsyncInfo 介面的 Lambda 或 functor,僅適用於 Windows 執行階段 應用程式。
如需如何使用工作接續撰寫異步工作的詳細資訊,請參閱 工作平行處理原則。
wait
等候這個工作到達終止狀態。 如果符合所有的工作相依性,而且未經選取供背景工作執行,則 wait
可以執行內嵌工作。
task_status wait() const;
傳回值
可能是 task_status
或 completed
的 canceled
值。 如果工作在執行時發生例外狀況,或例外狀況從前項工作傳播至它,則 wait
將會擲回該例外狀況。
備註
重要
在 通用 Windows 平台 (UWP) 應用程式中,請勿在使用者介面線程上執行的程式代碼中呼叫 wait
。 否則,因為這個方法會封鎖目前的執行緒,而且可能會導致應用程式沒有回應,所以執行階段會擲回 concurrency::invalid_operation 。 不過,您可以呼叫 concurrency::task::get 方法來以工作為基礎連續的形式接收前項工作的結果。