0

アプリに FileSavePicker コントラクトを実装したので、ユーザーがメール アプリから添付ファイルを選択してアプリに保存したい場合、OnTargetFileRequested(FileSavePickerUI^ sender, TargetFileRequestedEventArgs^ e) メソッドがトリガーされます..

OnTargetFileRequested(FileSavePickerUI^ sender, TargetFileRequestedEventArgs^ e) 
{
auto request = e->Request;
auto deferral = request->GetDeferral();

create_task(ApplicationData::Current->LocalFolder->CreateFileAsync(sender->FileName,    CreationCollisionOption::GenerateUniqueName)).then([request, deferral](StorageFile^ file)
{
    // Assign the resulting file to the targetFile property indicates success
    request->TargetFile = file;

    // Complete the deferral to let the Picker know the request is finished.
    deferral->Complete();

return file;

 }.then([=](StorageFile^ file)

{

 //here i will upload file to my metro app 

}

今、作成したファイルをメトロアプリにアップロードする必要があります....しかし、deferral->completeの問題に直面しています...ファイルをアップロードした後にdeferral->complete() completeを書き込む必要があるかどうかapp 以上の deferral->complete ステートメントは正しいです。??...

しかし、ファイルをアップロードした後に deferral->complete を使用すると、常に 0 バイトのファイルがアップロードされます...

上記のコードに示すように createFileAsync() で deferral->complete を使用すると、ファイルがアップロードされません........助けてください...

これが正しいアプローチであるか教えてもらえますか? ...

前もって感謝します...

4

1 に答える 1

0

メソッドの最後の await 呼び出しの後に deferral->Complete() を呼び出す必要があります。defferal の目的は、呼び出されたメソッドが返されたとしても、まだ非同期アクションが進行中であることを呼び出し元に通知することです。deferral が完了と呼ばれると、呼び出し元はすべてが完了したことを認識します。

そのため、ファイルをアップロードした後、またはファイルをキャッシュにコピーした後に、おそらく deferral->Complete() を呼び出す必要があります。バイトが転送されない場合は、ファイルが正しく転送されていることを確認してください。OpenReadAsync を使用して元のファイルを開き、ストリームをメモリ ストリーム (大きなファイルにはお勧めしません) にコピーするか、ファイルまたはどこかにキャッシュしてから送信する必要があります。 .

于 2012-09-27T08:29:09.953 に答える