繁体   English   中英

如何使C#方法异步

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM