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 

}

现在无论我创建什么文件,我都需要上传到我的 Metro 应用程序....但是我面临 deferral->complete 的问题...在将文件上传到我的文件后是否需要写入 deferral->complete() app 或以上的 deferral->complete 语句是否正确.??...

但是当我在上传文件后使用 deferral->complete 时,总是有 0 个字节的文件被上传......

如果我在 createFileAsync() 中使用 deferral->complete ,如上面的代码所示,那么文件没有上传......请帮助我......

你能告诉我这是正确的方法吗?

提前致谢...

4

1 回答 1

0

您应该在方法中最后一次等待调用之后调用 deferral->Complete() - deferal 的目的是通知调用者,即使被调用的方法返回,仍有异步操作正在进行。一旦延迟被称为完成,那么调用者就知道一切都已完成。

因此,您可能应该在上传文件或将文件复制到缓存后调用 deferral->Complete() 。如果没有传输字节,请确保正确传输文件 - 您必须使用 OpenReadAsync 打开原始文件并将流复制到您的内存流(不推荐用于大文件),或者缓存文件或某处然后发送它.

于 2012-09-27T08:29:09.953 回答