Async Repository&的CancellationToken

时间:2012-11-28 19:22:02

标签: .net-4.5 async-await cancellation cancellation-token

我们正在转向.NET 4.5,我正在考虑向我的存储库添加异步:

interface IRepository<T>
{
    T Find(int id);
    Task<T> FindAsync(int id);
    IEnumerable<T> FindAll();
    Task<IEnumerable<T>> FindAllAsync();
    ...
}

实现可能会调用DB,WebServices等。

我的问题是,我应该支持CancellationToken吗?

(别担心 - FindAllAsync()可能是基于Rx的:))

2 个答案:

答案 0 :(得分:1)

好吧,一定要将async添加到您的存储库中。我全都以async接管世界。 :)

CancellationToken支持是另一个问题。如果底层实现(DB / web服务)支持它,那么我通常会提供它,如果它可能需要(在这种情况下,实现非常简单,我宁愿提供它)。

请注意,您可以提供不带CancellationToken的重载,只需调用通过CancellationToken.None的主实现。或者,您可以在new CancellationToken()的接口上提供相当于CancellationToken.None的默认值。我曾经一直使用默认值方法,但有一些情况(比如将Action变量分配给myRepository.FindAllAsync),其中重载允许方法解析,但默认值不允许。

答案 1 :(得分:0)

我打算问同样的问题。我开始认为答案是“只有你相信取消是一个重要的场景”。如果您认为某些存储库需要花费很长时间才能使用户或基础结构服务取消进程内查询,那么您应该这样做。我可以想象,对于一个查询,尽管人们会认为大多数更新和插入都会很快发生。如果他们不这样做,可能是因为异常情况会导致失败(超时?)任务。

添加对CancellationToken的支持将要求所有呼叫者提供一个具有恶意链接效果的呼叫者。