私の現在のプロジェクトでは、最近の問題があり、それを理解するのに苦労しています:
concurrency::create_task(BPClient->ReadAnswer()).then([this](Windows::Foundation::Collections::IVector<unsigned char>^ Vec) {
WSS::InMemoryRandomAccessStream^ imras = ref new WSS::InMemoryRandomAccessStream();
WSS::DataWriter^ dw = ref new WSS::DataWriter(imras->GetOutputStreamAt(0));
for(long long i = 0; i < Vec->Size; i++){
dw->WriteByte(Vec->GetAt(i));
}
concurrency::create_task(dw->StoreAsync()).then([this, imras](unsigned int Count){
Windows::UI::Xaml::Media::Imaging::BitmapImage^ bi = ref new Windows::UI::Xaml::Media::Imaging::BitmapImage();
Image^ img = ref new Image();
bi->SetSource(imras);
img->Source = bi;
img->Width = 400;
img->Height = 400;
img->SetValue(Grid::ColumnProperty, 2);
concurrency::create_task(coredisp->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, ref new Windows::UI::Core::DispatchedHandler([=]() {
this->MainGrid->Children->Append(img);
})));
});
});
これは正常に機能し、期待される結果が得られます。しかし、私がそれを
concurrency::create_task(BPClient->ReadAnswer()).then([this](Windows::Foundation::Collections::IVector<unsigned char>^ Vec) {
WSS::InMemoryRandomAccessStream^ imras = ref new WSS::InMemoryRandomAccessStream();
WSS::DataWriter^ dw = ref new WSS::DataWriter(imras->GetOutputStreamAt(0));
for(long long i = 0; i < Vec->Size; i++){
dw->WriteByte(Vec->GetAt(i));
}
concurrency::create_task(dw->StoreAsync()).wait(); //consider this line
Windows::UI::Xaml::Media::Imaging::BitmapImage^ bi = ref new Windows::UI::Xaml::Media::Imaging::BitmapImage();
Image^ img = ref new Image();
bi->SetSource(imras);
img->Source = bi;
img->Width = 400;
img->Height = 400;
img->SetValue(Grid::ColumnProperty, 2);
concurrency::create_task(coredisp->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, ref new Windows::UI::Core::DispatchedHandler([=]() {
this->MainGrid->Children->Append(img);
}))).wait();
});
concurrency::create_task
最終的に、最後の-callに無効なパラメーターが渡されたというエラーが表示されます。
ここで実際に何が起こっているのですか?concurrency::task::then
とを混在させることはできませんconcurrency::task::wait
か? concurrency::task::wait
代わりにを使用する場合と同様のタスク チェーンを作成していると思いますconcurrency::task::then
。
ありがとうございました