[英]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.