繁体   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