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

C# 设计模式:跨应用程序层管理异步任务,c#,asynchronous,task,C#,Asynchronous,Task,在C#中使用任务编写异步方法的新手。这是一个关于如何在应用程序层之间设计调用异步任务的问题 我有一个数据访问层,可以对服务器进行REST调用。我为每个服务器调用实现了异步方法,每个调用返回一个任务 我有一个业务逻辑层,可以调用数据访问层。对业务逻辑层的异步请求采用回调,该回调将在任务完成后使用ContinueWith()执行。因此,异步执行的详细信息包含在业务逻辑层中 我想知道这种设计选择是否有意义,或者对于我的业务层来说,将任务对象传递给它的调用者是否更好 下面是我的DateManager的一

在C#中使用任务编写异步方法的新手。这是一个关于如何在应用程序层之间设计调用异步任务的问题

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

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

我想知道这种设计选择是否有意义,或者对于我的业务层来说,将任务对象传递给它的调用者是否更好

下面是我的
DateManager
的一个例子。没有等待,我像这里一样写了它。然而,从我的视图控制器,用回调调用
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);
        });
    }
}
公共类日期管理器:IDateManager
{
public void GetTradeDate(字符串dt,操作回调)
{
DateManagerClient dmc=新的DateManagerClient();
Task t=dmc.GetTradeDateAsync(dt);
t、 继续(x=>
{
回调(x.Result);
});
}
}

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

我建议这样做是因为以下几个原因:

  • 如果提供回调(如示例中所示),还必须指定回调输入参数(在示例中为字符串)和返回类型。这是一个不必要的限制
  • 它更接近异步/等待模式,因此如果您在某个时候将实现它,那么代码中不会有太大的变化
  • 将业务代码保留在业务层中,将调用方代码保留在调用方所在的任何层中(而不是将调用方代码注入到业务层中)更为简洁

  • 正如你可能注意到的,这里主要是我的观点(除了#1,这是一个相当可靠的好处)。但根据我的经验,这是我能给出的最好答案(我也使用过没有async/Wait和boy的任务,这很痛苦)

    一般来说,
    async
    的咒语是“一路异步”。也就是说,如果任何给定的方法内部有一个
    async
    操作,那么它应该
    等待该操作,并且本身应该是
    async
    。一直到调用它的顶级应用程序技术。在同步操作之后“隐藏”
    async
    操作是有问题的。这听起来有点不对劲,您不需要提供对异步方法的回调。。。您只需等待异步方法并从那里继续。但是我可能误解了这个场景,您是否可以提供一些代码来说明您到目前为止的情况?我使用的是VS2010,因此我没有
    wait
    async
    。我试着在我的业务层中使用回调来实现这一点,但我知道我可以只使用任务,而我在RestClient中使用了任务。现在我有两个范例。添加了一个代码示例来演示我是如何做的。但是,我喜欢@David关于应该重复异步模式的建议。@gdbj:无论是使用
    async
    /
    wait
    还是其他方式,我认为总体规则都应该保持不变。尽可能多地将任务公开到最高层。让消费应用程序/技术处理任务的同步。如果您仍然需要手动编写代码来处理它,那就好了。我强烈认为,除非有真正令人信服的理由,否则代码应该在应用程序层中。当有这样的原因时,要非常小心,不要重新发明
    异步void
    反模式。确保已处理错误案例。