C# 等待和同步 - 我是否误解了什么?

标签 c# windows-store-apps

我已将一个应用程序从 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/

相关文章:

JavaScript Metro 应用程序后台任务错误

c# - 为什么我的 Grid Tapped 事件没有被调用?

css - 如何在 Windows 8 Store 应用程序的不同设备上使用屏幕区域的所有高度设置自动列数?

visual-studio-2012 - Windows 应用商店应用部署错误

c# - 从 Azure 上的存储加载 DLL

c# - 如何在不使用 sleep 的情况下在 C# 中执行短暂的延迟?

C# - XML 将复杂类序列化为其原始类型

c# - 列表属性上的 GroupBy → 每个组中的对象

c# - System.IO.File.Exists(fpath)在Chrome和Firefox中返回false

c# - 如何使用 Windows Store C++ 在没有窗口句柄的情况下渲染路径几何