[英]How to make C# method async
我在下面是正常的N層簡化方案:
控制器呼叫BLL呼叫DAL
CONTROLLER具有以下方法:
public void WarmUp()
{
var bll=_bll.WarmUp(ID);
}
BLL具有:
public bool WarmUp()
{
return_dal.WarmUp(ID);
}
DAL具有:
public bool FetchData()
{
var dal=_bll.WarmUp(ID);
if(dal !=null)
{return true;}
else{return false;}
}
現在,我想做的是使BLL和DAL方法(不確定是否必須都是async )成為ASYNC,以便在CONTROLLER調用后,它不會阻塞線程。
我還沒有完成基於任務的編程。 有人可以幫我將上述代碼(BLL / DLL)轉換為異步代碼(c#async await),以使它們異步嗎?
您的DAL代碼調用了BLL,這是錯誤的。
DAL應該使用數據庫調用,這就是開始的地方。 例如,實體框架支持異步API,您可以調用它們,然后再await
。 這使您的DAL方法async
,因此它們的調用方(在BLL中)必須await
它們。 這使您的BLL方法async
,因此它們的調用者(在“控制器”中)必須await
它們。 這使您的“控制器”方法async
。
通常,我們可以說,第一個調用方法應標記為async
。 您的情況是控制器中的WarmUp
方法。
public async void WarmUp()
{
var bll=_bll.WarmUp(ID);
}
現在,我們假定_bll.WarUp(ID)是一個長期運行的方法。 因此,我們將以某種方式重構此方法,使其返回Task
public Task<bool> WarmUp()
{
return Task.Run(()=>{_dal.WarmUp(ID);});
}
但這並不能解決我們的問題,因為現在有了這種情況,如果調用Controller方法,我們將立即返回。 如果我們不需要Task的返回值,這沒問題。 但是,如果需要,我們可以使用await
關鍵字:
public async void WarmUp()
{
var bll= await _bll.WarmUp(ID);
if(bll)
{
//do whatever you want
}
}
這個怎么樣:
public Task<bool> FetchData()
{
var tcs = new TaskCompletionSource<bool>();
Task.Run(() => {
var dal=_bll.WarmUp(ID);
tcs.SetResult(dal != null);
});
return tcs.Task.Result;
}
TaskCompletionSource可以使不異步的東西變得異步。 然后,您可以等待通話,直到最后一層
public async Task<bool> WarmUp()
{
return await _dal.WarmUp(ID);
}
這可能是您的GUI按鈕回調。 在某些時候,您需要一個異步void方法,但這是一種“一勞永逸”的方法。 除非您有某種事件處理程序,否則應避免使用。
public async void WarmUp()
{
var bll= await _bll.WarmUp(ID);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.