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

これが機能するように設定するにはどうすればよいですか?

4

1 に答える 1

5

Windows ストア アプリを作成するときに従わなければならない最も重要な規則の 1 つは、UI スレッドをブロックしてはならないということです。決して。

非同期操作を開始すると、その操作を「所有する」futureまたはを取得します。非同期操作が完了する前にその操作に対してorをtask呼び出すと、その呼び出しは操作が完了するまでブロックされ、その後結果が返されます。get()wait()

UI スレッドをブロックすることは悪いことなので、UI スレッドでまだ完了していない非同期操作と同期しようとすると、UI スレッドがブロックされるのを防ぐためにget()orの呼び出しがスローされます。wait()この例外は、UI スレッドをブロックしないようにするためのものです。:-)

を使用して、非同期操作が完了したときに実行される継続を提供する必要taskがあります。then()継続を UI スレッドでも実行する必要がある場合は、必ず に渡しtask_continuation_context::use_current()then()、継続が実行のために UI スレッドにマーシャリングされるようにしてください。


注: この例外は、C++/CX を使用している場合にのみスローされます。C++/CX 言語拡張なしで C++ を使用している場合、get()orの呼び出しwait()は正常にブロックされ、ユーザー エクスペリエンスが低下する可能性があります。一般に、C++/CX には、優れたコードを簡単に記述できるように設計された、このような「ガード レール」機能が他にも多数あります。C++/CX を使用すると、エラーが発生する可能性が高くなることを理解した上で、C++ の能力を最大限に活用できます。

于 2012-10-11T23:35:27.010 に答える