我们有一个长期建立的、非常多平台的代码库,目前正在移植到 WinRT。我们面临的挑战之一是如何处理 WinRT 的异步风格。
例如,我们不确定如何处理 WinRT 的异步文件操作。不出所料,我们代码库的 API 是同步的。一个典型的例子是我们的 File::Open 函数,它尝试打开一个文件并返回成功或失败。我们如何调用 WinRT 函数并保持函数的行为相同?
请注意,不幸的是,我们受到遗留问题的限制:我们不能简单地将 API 更改为异步。
谢谢!
我们有一个长期建立的、非常多平台的代码库,目前正在移植到 WinRT。我们面临的挑战之一是如何处理 WinRT 的异步风格。
例如,我们不确定如何处理 WinRT 的异步文件操作。不出所料,我们代码库的 API 是同步的。一个典型的例子是我们的 File::Open 函数,它尝试打开一个文件并返回成功或失败。我们如何调用 WinRT 函数并保持函数的行为相同?
请注意,不幸的是,我们受到遗留问题的限制:我们不能简单地将 API 更改为异步。
谢谢!
我假设您希望重新实现库以支持 WinRT 应用程序,同时不更改 API 的定义,以便现有应用程序保持兼容。
我认为如果在调用异步方法时不包含 await 关键字,您将不会执行异步操作,它应该以同步方式执行。但是,如果该方法返回一个值(根据我的经验),它确实不起作用。
我一直在使用此代码使文件操作同步:
IAsyncOperation<string> contentAsync = FileIO.ReadTextAsync(file);
contentAsync.AsTask().Wait();
string content = contentAsync.GetResults();
如果您想与不支持 async/await 的平台共享您的代码 - 您可能最好为旧平台使用不同的 API,而新平台使用类似的开关
#if SILVERLIGHT
#elif NETFX_CORE
#elif WPF
#endif
最终,异步 API 可能会出现在较旧的平台中,并且您实际上可以将非异步调用包装到 Tasks 中,以使它们在不异步的情况下异步。强制异步方法同步工作势必会很快反击你。例如,您的 WinRT 应用程序可能会在几秒钟内无响应并被操作系统杀死。或者,您可能会在等待任务完成并阻塞他们尝试完成的线程时遇到死锁。