簡體   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