3日前からこれに対する答えを探してみました。それは、私が何か根本的に間違ったことをした (明らかな間違いがある) か、それが新しすぎて参照できないかのどちらかです。このような単純なケースが失敗する理由がわかりません。
次のコードは、Windows ストア アプリケーションで C++ の PPL タスク ライブラリを使用し、ループから抜け出すまでに 2 秒かかるファイル読み込み操作をシミュレートします (もちろん、これは最小限のコードで問題を説明するためのものであり、実際のループでは他のレンダリングを実行して、進行状況も表示します)。
継続コンテキストとして「use_current」を使用すると、コードの継続部分 (つまり、「fileLoaded = true」) が呼び出されることはありません。
bool fileLoaded = false;
while (!fileLoaded)
{
concurrency::task<void>([this]()
{
// Simulate file load delay
concurrency::wait(2000);
}).then([this, &fileLoaded]()
{
fileLoaded = true; // This never gets executed!
// If the following is changed to "use_default" or
// "use_arbitrary", then this continuation gets called.
}, concurrency::task_continuation_context::use_current());
concurrency::wait(50);
}
「use_default」または「use_arbitrary」を使用し、「fileLoad」を「true」に適切に設定すると、同じコードが機能します。このコードは、Windows ストア C++ アプリ (Direct2D アプリなど) のどこにでも配置できますが、失敗します (「DirectXPage::DirectXPage」コンストラクター本体に配置しました。これがメイン UI スレッドであると予想されます)。私はひどく間違ったことをしましたか?
よろしくお願いします。:)