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);
});
}
}
通常'async'的口頭禪一直是「異步向下」。也就是說,如果任何給定的方法在內部有一個「異步」操作,那麼它應該「等待」該操作並且本身應該是「異步」。一直到調用它的頂級應用程序技術。在同步操作後隱藏「異步」操作是有問題的。 – David
它聽起來有點不對,你不應該提供一個回調到異步方法......你應該只需要等待異步方法,並從那裏繼續。但是我可能會誤解這種情況,你能否提供一些代碼來說明你到目前爲止的情況? – Shazi
我使用的是VS2010,所以我沒有'await'和'async'。我試着用我的業務層的回調來實現它,但是我知道我可以使用Tasks來代替我使用的RestClient。現在我有兩個範例。添加了一個代碼示例以顯示我如何執行此操作。但是,我喜歡@大衛的建議,應該重複異步模式。 – gdbj