あるラムダからの戻り値が次の引数に渡されることを理解しています。ただし、複数のデータを渡す必要がある場合や、1 つのラムダの戻り値の型がプログラム構造によって既に設定されている場合はどうでしょうか。
これらの両方がファイルピッカーを開いて、その内容をテキストとして読み取り、元のファイルが何であったかを覚えている場合の作業コードを次に示します。
create_task(picker->PickSingleFileAsync())
.then([this](StorageFile^ file)
{
if (file == nullptr) cancel_current_task();
m_OpenFilename = file->Name;
return FileIO::ReadTextAsync(file);
})
.then([this](String^ fileContents)
{
//do something with the filename and file contents
});
これを機能させるには、非同期タスクの間にファイル名を格納するためのクラス変数を追加する必要があることに注意してください。これは、いくつかの理由で悪いと思います。
- 単一のメソッドの内部使用のためにクラス変数を持つのは醜い
- これはスレッドセーフですか?誰かがファイル ピッカーを開いてファイルを選択することに夢中になった場合、m_OpenFilename にアクセスするときに、これらの非同期タスクが互いに破壊される可能性はありますか?
- これは 1 つの変数を使用した簡単な例にすぎませんが、ファイルのパスとそのファイル属性、およびその他の多くの特性も追跡したいとします。クラス変数の数が増えるにつれて、クラスはますます醜く見えます。
私の最初のアプローチは、変数を関数のスコープ内に置き、キャプチャ リストを[this, OpenFilename]
. ただし、ラムダが実行されるまでに、C++/CX のバックグラウンド メモリ ハンドラーは既に を破棄しておりOpenfilename
、アクセス時にアクセス違反が発生するため、これは失敗します。
私の例ではReadTextAsync
、ファイルとそのコンテンツの両方に同時にアクセスできるように、ファイルのメタデータを結果に渡すにはどうすればよいですか?