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