使用C#中的Tasks编写异步方法的新手。这是一个关于如何设计跨应用程序层调用异步任务的问题。
我有一个数据访问层,可以对服务器进行REST调用。我已经为每个服务器调用实现了异步方法,每个方法都返回一个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);
});
}
}
最佳答案
即使您不能使用async / await关键字,我仍然建议您将任务返回给调用方。
我建议这样做的原因如下:
如果提供了回调(如您的示例中所示),则还必须指定回调输入参数(在您的示例中为字符串)和返回类型。这是不必要的限制
它与async / await模式有点接近,因此,如果您将在某个时候实现它,那么代码中的变化不会太大。
将商务代码保留在商务层中,并将调用者代码保留在呼叫者所在的任何层中,这是更干净的做法(而不是将调用者代码注入到商务层中)
您可能会注意到,这主要是我的看法(除了#1之外,那是相当可观的收益)。但是,这是我可以根据自己的经验给出的最佳答案(我也使用了没有异步/等待的任务,而男孩确实很痛苦)
关于c# - 设计模式:跨应用程序层管理异步任务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35661189/