2012-10-11 47 views
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 

如何设置这使其作品?

+0

你是从ui线程调用这段代码吗? – Denis

回答

4

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

如果您启动异步操作,您将收到“拥有”该操作的futuretask。如果在异步操作完成之前对该操作调用get()wait(),则该调用将在之前执行,直到操作完成,然后它将返回结果。

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

你应该使用taskthen()来提供一个继续,当异步操作完成时将运行。如果继续需要在UI线程上运行,请确保将task_continuation_context::use_current()传递给then()以确保将继续封送回UI线程执行。


注:如果您正在使用C++/CX该异常仅抛出。如果您使用C++而不使用C++/CX语言扩展,则可能会阻止对get()wait()的调用,从而可能导致糟糕的用户体验。一般来说,C++/CX拥有更多像这样的“护栏”功能,可以让您更轻松地编写出色的代码。当使用C++/CX时,您将获得C++的全部功能,并且理解错误的机会更多。

+0

我不明白这个答案,wait()并不表示线程阻塞,而只是说当前执行被挂起,线程可以继续运行并处理消息 –