设计模式:跨应用程序层管理异步任务

时间:2016-02-26 20:32:52

标签: c# asynchronous task

使用C#中的Tasks编写异步方法的新功能。这是一个关于如何架构从跨应用​​程序层调用异步任务的问题。

我有一个数据访问层,可以对服务器进行REST调用。我为每个服务器调用实现了Async方法,每个方法都返回一个Task。

我有一个业务逻辑层,可以调用数据访问层。对异步业务逻辑层的请求采用回调,一旦任务使用ContinueWith()完成,就会执行回调。因此,异步执行的细节包含在业务逻辑层中。

我想知道这种设计选择是否有意义,或者我的业务层是否更好地将Task对象传递给其调用者?

这是我到目前为止DateManager的一个例子。没有await,我写的就像我在这里一样。但是,从我的视图控制器中,使用回调调用DateManager.GetTradeDate()现在可能很尴尬。

public class DateManager : IDateManager
{
    public void GetTradeDate(string dt, Action<string> callback)
    {
        DateManagerClient dmc = new DateManagerClient();
        Task<string> t = dmc.GetTradeDateAsync(dt);
        t.ContinueWith(x =>
        {
            callback(x.Result);
        });
    }
}

1 个答案:

答案 0 :(得分:0)

即使你不能使用async / await关键字,我仍然建议将任务返回给调用者。

我建议这是因为几个原因:

  1. 如果提供回调(如示例中所示),则还必须指定回调输入参数(在您的示例中为字符串)和返回类型。这是一个不必要的限制
  2. 它更接近async / await模式,因此如果您在某个Point上实现它,那么它将不会在代码中发生如此大的变化。
  3. 将商务代码保留在商务层中,并将调用者代码保存在调用者所在的任何层中(而不是将调用者代码注入商务层),这样更清晰。
  4. 正如您可能会注意到的,我的观点主要是在这里发言(#1除外,这是非常可靠的好处)。但这是我能用我的经验给出的最佳答案(我还没有使用异步/等待任务而且男孩很痛苦)