2016-02-26 76 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,這是一個非常穩固的好處)。但是,這是我可以用我的經驗給出的最好答案(我也使用了沒有異步/等待的任務,而男孩是一種痛苦)