簡體   English   中英

等待任務拋出

[英]Waiting for task throws

我只是從WinRT的並發模型開始。 我有一個需要等待的任務,但是調用wait()會引發一個我無法捕獲的異常。

最簡單的代碼:

concurrency::task<StorageFile^> getFileTask = concurrency::create_task(Windows::Storage::ApplicationData::Current->LocalFolder->GetFileAsync(fileString));
getFileTask.wait();

它引發的異常是:

Microsoft C++ exception: Concurrency::invalid_operation at memory location 0x0402C45C

我如何設置它使其起作用?

構建Windows應用商店應用程序時必須遵循的最重要規則之一是,您絕不能阻止UI線程。 永遠不能。

如果啟動異步操作,則會獲得“擁有”該操作的futuretask 如果在異步操作完成之前在該操作上調用get()wait() ,則該調用將阻塞直到操作完成,然后它將返回結果。

由於阻塞UI線程很不好,因此,如果嘗試與UI線程上尚未完成的異步操作進行同步,則會拋出對get()wait()的調用,以防止UI線程被阻塞。 那里有異常可以幫助您記住不要阻塞UI線程。 :-)

您應該使用taskthen()提供將在異步操作完成時運行的延續。 如果繼續操作也需要在UI線程上運行,請確保將task_continuation_context::use_current()傳遞給then()以確保繼續操作被編組回UI線程以執行。


注意:僅當您使用C ++ / CX時,才會引發此異常。 如果您使用的是不帶C ++ / CX語言擴展的C ++,則對get()wait()的調用將成功阻止,從而可能導致不良的用戶體驗。 通常,C ++ / CX具有更多類似“護欄”的功能,旨在使您更輕松地編寫良好的代碼。 當使用C ++ / CX時,您將了解C ++的全部功能,並且有更多的出錯機會。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM