取消不同异步操作的常用方法

时间:2013-01-31 15:26:34

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

我有一些非常重要的任务,我很高兴收到你的来信,如何更好地解决它。简而言之,这是关于管理不同性质的长期任务。虽然我正在为Windows Phone做这个,但我觉得这里可以应用一些基于C#和.NET标准方法的一般原则。

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

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

挑战来了。例如,可以通过CancellationToken取消async / await stuff。我可以在BaseViewModel中收集所有取消令牌,并在需要时全部使用它们。但是,这不适用于基于事件的异步。当然,可以通过虚函数调用将具体的取消操作委托给子视图模型。但我想尽可能多地将代码移动到BaseViewModel。

那么,有没有办法统一取消任务和基于事件的异步?

2 个答案:

答案 0 :(得分:2)

为什么不会 CancellationToken(Source)基础设施用于事件驱动的组件?您可以使用在发生取消时调用的令牌注册回调。在该回调中,您可以取消订阅事件源。一般而言,您可以执行静默系统所需的任何操作。这只是将令牌分发给与取消有关的所有组件。

实际上,这是CancellationToken(Source)基础设施的“美”。它非常简单但普遍适用。

答案 1 :(得分:0)

基于事件的模式有些不统一,所以我没有看到一个完全干净的解决方案,如果没有为每个操作编写一些个案的代码。一些选项可能是:

  • Wrap在任务中执行基于非任务的异步操作,以提供统一的方法。需要相当多的无聊代码(由于EAP的不均匀性)。

  • 在简单的取消委托中包含您的任务和事件订阅,让您的基类只知道这些取消操作(可能不仅仅是一个操作,而是相对简单的事情)

在我看来,无论如何你需要编写每个事件代码来取消,但是使用一些辅助方法来存储任务和基于事件的操作的信息,它可能非常轻量级。 / p>