【问题标题】:FileSavePicker Contract ImplmentationFileSaver 选择器合同实施
【发布时间】:2012-09-27 07:07:10
【问题描述】:

我已经在我的应用程序中实现了 FileSavePicker Contract,所以当用户从邮件应用程序中选择一个附件并想要保存到我的应用程序时,就会触发 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()文件到我的应用程序或以上 deferral->complete 声明是正确的。??...

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

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

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

提前谢谢...

【问题讨论】:

    标签: visual-c++ c++11 windows-8 microsoft-metro c++-cx


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-05
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      相关资源
      最近更新 更多