2016-02-26 72 views
2

使用C#中的任务编写异步方法的新手。这是一个关于如何架构师跨应用程序层调用异步任务的问题。设计模式:跨应用程序层管理异步任务

我有一个数据访问层,使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); 
     }); 
    } 
} 
+0

通常'async'的口头禅一直是“异步向下”。也就是说,如果任何给定的方法在内部有一个“异步”操作,那么它应该“等待”该操作并且本身应该是“异步”。一直到调用它的顶级应用程序技术。在同步操作后隐藏“异步”操作是有问题的。 – David

+1

它听起来有点不对,你不应该提供一个回调到异步方法......你应该只需要等待异步方法,并从那里继续。但是我可能会误解这种情况,你能否提供一些代码来说明你到目前为止的情况? – Shazi

+0

我使用的是VS2010,所以我没有'await'和'async'。我试着用我的业务层的回调来实现它,但是我知道我可以使用Tasks来代替我使用的RestClient。现在我有两个范例。添加了一个代码示例以显示我如何执行此操作。但是,我喜欢@大卫的建议,应该重复异步模式。 – gdbj

回答

0

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

我认为这是因为以下几个原因:

  1. 如果你(在你的榜样等)提供一个回调,您还必须指定回调输入参数(在你的例子是一个字符串)和返回类型。这是一个不必要的限制
  2. 它更接近异步/等待模式,因此,如果你在某个点将实现它,那么它不会在代码中发生如此大的变化。
  3. 它的清洁,以保持在楼内设有商务层楼内设有商务代码和调用程序的代码在任何层来电者是(而不是注入的调用程序的代码进入楼内设有商务层)

正如你可能已经注意到,它主要是我的意见在这里发言(除了#1,这是一个非常稳固的好处)。但是,这是我可以用我的经验给出的最好答案(我也使用了没有异步/等待的任务,而男孩是一种痛苦)