我已将一个应用程序从 Android 移植到 Windows Phone 7,并且能够使用同步调用来文件 io 等,而不会出现很多问题(我使用线程,因此这简化了事情)。
但是,现在我正在移植到 Windows 8 应用商店应用,并且 XxxAsync() 方法在 API 中非常猖獗。
我应该盲目地使用异步 api 并希望得到最好的结果吗?
我有各种疑问......例如:
假设用户点击“保存”按钮来保存数据模型。所有保存都是异步完成的。这意味着用户可以在保存数据模型时更改数据模型。如果中途修改,这不会弄乱数据并损坏他的文件吗?
这如何让开发人员变得更轻松?
我读过各种异步文章(例如 this ),但我觉得我可能错过了一些东西......
感谢您的见解。
最佳答案
UI 中异步的想法是,您的所有代码都在一个线程(UI 线程)上运行。当用户单击“保存”按钮时,您的处理程序将运行。此时,UI 正忙于运行您的代码,因此 UI 不具有交互性。当您准备好要发送到服务器的数据的快照后,您将启动异步保存,并且(从技术上讲)您的处理程序已完成。控制权传回 UI,UI 再次变得响应。
此时,用户可以更新数据模型,但操作系统不会查看数据模型。它只是确保将单独的数据缓冲区(您在“保存”按钮处理程序中创建的快照)发送到服务器。当发生这种情况时,您的异步回调将再次在 UI 线程上执行。根据您使用的版本,您可能需要使用 BeginInvoke 手动将该调用转移到 UI 线程。 .
这与浏览器内 JavaScript 中使用的模型完全相同。
它并不能完全解决所有同步问题。例如,除非您在上传过程中禁用“保存”按钮,否则用户可以在服务器已接收第一个保存时再次单击“保存”。但这只是服务器需要担心的问题,并且它最好能够应对两个同时尝试的保存。
您可能遇到的一个问题是应用程序的早期版本。如果您到处使用线程,您是否正确使用了锁或线程安全数据结构?您描述的问题肯定存在于自由线程应用程序中!
关于C# 等待和同步 - 我是否误解了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13489810/