如何将WinRT异步任务集成到现有的同步库中?

时间:2012-10-10 15:11:07

标签: windows asynchronous windows-8 windows-runtime

我们有一个长期建立的大型多平台代码库,目前正在移植到WinRT。我们面临的挑战之一是如何处理WinRT的异步风格。

例如,我们不确定如何处理WinRT的异步文件操作。不出所料,我们的代码库的API是同步的。一个典型的例子是我们的File :: Open函数,它试图打开一个文件并返回成功或失败。我们如何调用WinRT函数并保持函数的行为相同?

请注意,遗憾的是我们受到限制:我们不能简单地将API更改为异步。

谢谢!

2 个答案:

答案 0 :(得分:6)

我假设您希望重新实现库以支持WinRT应用程序,同时不会改变API的定义,以便现有应用程序保持兼容。

我认为如果在调用异步方法时不包含await关键字,则不会执行异步操作,它应该以同步方式执行。但是如果方法返回一个值(根据我的经验),它确实不起作用。

我一直在使用此代码使文件操作同步:

IAsyncOperation<string> contentAsync = FileIO.ReadTextAsync(file);
contentAsync.AsTask().Wait();
string content = contentAsync.GetResults();

答案 1 :(得分:2)

如果您想要使用不支持async / await的平台共享您的代码 - 您可能最好为旧平台使用不同的API,而使用

等开关的新API
#if SILVERLIGHT
#elif NETFX_CORE
#elif WPF
#endif

最终,异步API可能会出现在较旧的平台上,您实际上可以将非异步调用包装到Tasks中,以使它们不同步。强制异步方法同步工作必然会让你很快退缩。例如,您的WinRT应用程序可能会在几秒钟内无响应,并被操作系统杀死。或者你可以得到死锁等待任务完成并阻止他们试图完成的线程。