FileSavePicker合同实施

时间:2012-09-27 07:07:10

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

我已在我的应用中实现了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->完成上传文件后,总是会上传0个字节的文件......

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

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

提前感谢...

1 个答案:

答案 0 :(得分:0)

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

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