2012-10-11 123 views
1

我剛開始使用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 

如何設置這使其作品?

+0

你是從ui線程調用這段代碼嗎? – Denis

回答

4

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

如果您啓動異步操作,您將收到「擁有」該操作的futuretask。如果在異步操作完成之前對該操作調用get()wait(),則該調用將在之前執行,直到操作完成,然後它將返回結果。

由於阻塞UI線程是不好的,如果您嘗試與UI線程上尚未完成的異步操作同步,則會調用get()wait()以防止UI線程被阻塞。這個異常可以幫助你記住不要阻塞UI線程。 :-)

你應該使用taskthen()來提供一個繼續,當異步操作完成時將運行。如果繼續需要在UI線程上運行,請確保將task_continuation_context::use_current()傳遞給then()以確保將繼續封送回UI線程執行。


注:如果您正在使用C++/CX該異常僅拋出。如果您使用C++而不使用C++/CX語言擴展,則可能會阻止對get()wait()的調用,從而可能導致糟糕的用戶體驗。一般來說,C++/CX擁有更多像這樣的「護欄」功能,可以讓您更輕鬆地編寫出色的代碼。當使用C++/CX時,您將獲得C++的全部功能,並且理解錯誤的機會更多。

+0

我不明白這個答案,wait()並不表示線程阻塞,而只是說當前執行被掛起,線程可以繼續運行並處理消息 –