0

我正在为 Windows 设备开发通用 Windows 应用程序。我正在用 C++/CX 开发应用程序。

在应用程序中,我想检查设备上是否存在文件,并且呼叫应该阻止呼叫。所以我写了一个如下所示的函数。

FileExist(String^ myFolder, String ^myFile)
{
    // Get the folder object that corresponds to myFolder
    // this absolute path in the file system.
    try{
    create_task(StorageFolder::GetFolderFromPathAsync(myFolder)).then([=]                      (StorageFolder^ folder){

           create_task(folder->GetFileAsync(name)).then([=](StorageFile^ myfile){
           return true;
            });
           return false;
    });
    }
    catch (Exception^ e)
    {
            return false;
    }
}

但是 GetFolderFromPathAsync 和 GetFileAsync 调用是异步调用,我的函数应该是阻塞的,所以我等待每个 lambda。但我收到以下错误。

“一个无效参数被传递给一个认为无效参数致命的函数。”</p>

所以有人请告诉我如何为通用 Windows 应用程序的文件存在进行阻止调用。

4

1 回答 1

1

如果您的方法在 UI 线程上运行 - 您不能使其阻塞,因为它使用异步 API,这会阻止异步调用返回结果,从而导致死锁。如果“在基于任务的延续中”运行,您可以使用阻塞 get() 方法等待并获取任务的结果。

“在 Windows 应用商店应用程序中,请勿在 STA 上运行的代码中调用等待。否则,运行时会抛出 concurrency::invalid_operation,因为此方法会阻塞当前线程并可能导致应用程序无响应。但是,您可以调用concurrency::task::get 方法在基于任务的延续中接收先前任务的结果。”

https://msdn.microsoft.com/en-us/library/hh749955.aspx

于 2015-09-09T05:30:58.977 回答