1

我刚刚开始使用 WinRT 的并发模型。我有一项需要等待的任务,但调用 wait() 会引发我无法捕获的异常。

最简单的代码:

concurrency::task<StorageFile^> getFileTask = concurrency::create_task(Windows::Storage::ApplicationData::Current->LocalFolder->GetFileAsync(fileString));
getFileTask.wait();

它抛出的异常是:

Microsoft C++ exception: Concurrency::invalid_operation at memory location 0x0402C45C

我该如何设置它才能正常工作?

4

1 回答 1

5

构建 Windows 应用商店应用程序时必须遵循的最重要规则之一是永远不能阻塞 UI 线程。永远不能。

如果你启动一个异步操作,你会得到一个futuretask那个“拥有”那个操作。如果在异步操作完成之前调用该操作,则该调用将get()阻塞直到操作完成,然后它将返回结果。wait()

由于阻塞 UI 线程是不好的,如果你尝试在 UI 线程上与尚未完成的异步操作同步,调用get()orwait()将抛出,以防止 UI 线程被阻塞。此异常可帮助您记住不要阻塞 UI 线程。:-)

您应该使用task'sthen()来提供将在异步操作完成时运行的延续。如果延续也需要在 UI 线程上运行,请务必传递task_continuation_context::use_current()tothen()以确保将延续编组回 UI 线程执行。


注意: 仅当您使用 C++/CX 时才会引发此异常。如果您在没有 C++/CX 语言扩展的情况下使用 C++,则对get()or的调用wait()将成功阻塞,从而可能导致糟糕的用户体验。一般来说,C++/CX 有更多像这样的“护栏”特性,旨在让你更容易编写好的代码。使用 C++/CX 时,您将获得 C++ 的全部功能,并了解出错的机会更多。

于 2012-10-11T23:35:27.010 回答