c# - 取消不同异步操作的通用方法

标签 c# silverlight windows-phone-7 design-patterns windows-phone-8

我有一些不平凡的任务,我很高兴收到您的来信,了解如何更好地解决它。简而言之,这是关于管理不同性质的长期运行任务。当我为 Windows Phone 执行此操作时,我觉得可以在此处应用一些基于 C# 和 .NET 标准方法的一般原则。

我的应用程序主要围绕不同的服务类构建,这些服务类处理来自云、GPS、商业交易、身份验证等的数据。所有服务都归我们团队所有。服务在 View 模型内部使用,但不同服务中的 API 目前采用不同的方式。在某个地方它是异步/等待的,在某个地方它是基于事件的(比如在定位中,我需要不断更新地理坐标)。

现在我开始研究应用程序激活/停用的问题,我想在我的所有 View 模型中以通用的方式处理这个问题。主要的事情之一是当应用程序关闭或用户导航到另一个页面时取消当前的异步操作。我想将与此相关的代码放入 BaseViewModel 之类的东西中,以避免代码重复。然而,这意味着我需要统一处理所有 View 模型中的取消。

挑战来了。例如,异步/等待内容可以通过 CancellationToken 取消。我可以收集 BaseViewModel 中的所有取消 token ,并在需要时使用它们。但是,这不适用于基于事件的异步。当然,可以通过虚函数调用将具体的取消操作委托(delegate)给 subview 模型。但我想将尽可能多的代码移至 BaseViewModel。

那么,有没有一种方法可以统一任务的取消和基于事件的异步呢?

最佳答案

为什么不能CancellationToken(Source)基础设施适用于事件驱动组件?您可以使用发生取消时调用的 token 注册回调。在该回调中,您可以取消订阅事件源。一般来说,您可以执行任何必要的操作来停止系统。只需将 token 分发给所有与取消相关的组件即可。

实际上,这就是 CancellationToken(Source) 基础设施的“美妙之处”。它是如此简单但又如此普遍适用。

关于c# - 取消不同异步操作的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14629229/

相关文章:

c# - Silverlight 与 WPF 的关系是什么(如果有的话)?

c# - VS中Azure函数本地开发找不到函数

c# - VSTO Word 加载项 user.config 每次更新都丢失

silverlight - 防止 Silverlight 缩放线宽

C#:ILog 接口(interface)是否应该是或具有 IEnumerable<Message>?

html - silverlight 应用程序的浏览器滚动条问题。(Html)

silverlight - 用 Silverlight 做广告

iphone - 为什么 Windows Phone 7 模拟器比 iPhone OS 模拟器慢?

windows-phone-7 - 访问 WP7 中麦克风的输入数据?

c# - WP7 应用程序栏图标未在模拟器上显示(但在 Blend 中有效)