2

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

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

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

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

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

4

2 回答 2

2

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

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

于 2013-01-31T19:12:56.867 回答
0

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

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

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

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

于 2013-01-31T17:44:10.427 回答