簡體   English   中英

在數據訪問層中使用異步時是否有任何性能提升?

[英]Is there any performance gain when using async in Data Access Layer?

如果我在數據訪問層中使用Async功能,我懷疑是否有任何性能提升,如下所示:

public async Task<IEnumerable<TrnApplicant>> GetAllMemberApplicantsAsync(String webReferenceNumber)
{
    using (var context = new OnlineDataContext())
    {
        var applicant = await Task.Run(() => context.Applicants.First(
                app => app.RefNo.Equals(webReferenceNumber, StringComparison.OrdinalIgnoreCase)) );

        return GetApplicantsInGroup(applicant.ApplicantsGroupId);
    }      
}

如果不是什么時候更有意義呢?

考慮一下。

你打電話給別人並要求他們為你做點什么。 當他們這樣做的時候,你在排隊等待他們說“已經完成”。 這是同步工作。 稱他們為“塊”,直到他們與完成任務,然后你就可以回來,無論你在做什么, 事后的行為。

替代的,異步的方式,是你打電話,但不是在電話上等你掛斷,並在他們工作時做其他事情。 一旦他們給你回電話,說“已經完成”,你就會回去做他們需要做的任何事情。

現在, 如果你在等待時無所事事 ,那么絕對沒有性能上的提升,恰恰相反。 讓對方給你回電的開銷將增加到要完成的工作總量。

因此,通過上面對異步工作的描述,在等待數據訪問層完成其工作時,您是否有任何代碼可以執行的操作?

如果沒有,那么不,沒有性能提升。

如果是,則可能會有性能提升。


現在,說了這么多,我讀到了我的回答下面的評論,然后我仔細閱讀了你的代碼,我相信你並沒有真正利用正確的異步代碼。

最好的方法是使用某種正確進行異步I / O的系統或代碼。 你的代碼調用了Task.Run ,這實際上只是在手機前面Task.Run另一個人,等着你。

例如,考慮SqlCommand ,它可能是在這里與數據庫進行通信的實際代碼,它有兩個有趣的方法:

現在,如果你調用第一個,在使用Task.Run創建的線程上,你實際上仍在阻塞,你只是要求其他人為你做。

然而,第二個是我上面所描述的。

因此,在您的特定情況下,我會盡量避免使用Task.Run 現在,根據服務器的負載,這樣做可能是有利的,但如果可以,我將切換到使用底層對象的異步方法來正確執行它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM