gpt4 book ai didi

c# - 调用异步方法时使用 .Wait() 的情况是什么

转载 作者:行者123 更新时间:2023-11-30 21:55:02 25 4
gpt4 key购买 nike

我的 asp.net mvc-5 web 应用程序中有以下 async 长时间运行的方法:-

 public async Task<ScanResult> ScanAsync(string FQDN)
{
// sample of the operation i am doing
var c = await context.SingleOrDefaultAsync(a=>a.id == 1);
var list = await context.Employees.ToListAsync();
await context.SaveChangesAsync();
//etc..
}

我正在使用支持运行后台作业的 Hangfire 工具来及时调用此异步方法,但不幸的是,hangefire 工具不支持直接调用异步方法。所以为了克服这个问题,我创建了上述方法的同步版本,如下所示:-

public void Scan()
{
ScanAsync("test").Wait();
}

然后我从 HangFire 调度程序调用同步方法如下:-

RecurringJob.AddOrUpdate(() => ss.Scan(), Cron.Minutely);

所以我知道使用 .Wait() 将主要在方法执行期间占用 iis 线程,但是正如我提到的,我需要以这种方式进行,因为我不能直接调用一个hangefire 调度程序中的异步任务。

那么当我使用 .Wait() 调用异步方法时会发生什么?整个方法的操作是否会以同步方式完成?例如,如上所示,我在 ScanAsync() 中有三个异步操作;SingleOrDefualtAsyncToListAsyncSaveChangesAsync,那么它们是否会以同步方式执行,因为我正在使用 .wait() 调用 ScanAsync 方法?

最佳答案

so what will happen when i use .Wait() to call the async method ?, will the whole method's operations be done in a sync way ? for example as shown above i have three async operations inside the ScanAsync() ;SingleOrDefualtAsync,ToListAsync & SaveChangesAsync, so will they be executed in sync way because i am calling the ScanAsync method using .wait() ?

查询数据库的方法仍将异步执行,但您正在调用 Wait 的事实意味着即使您正在释放线程,它也不会返回到 ASP.NET 线程池当你停止它时。

这也可能导致死锁,因为 ASP.NET 具有自定义同步上下文,可确保在继续异步调用时请求的上下文可用。

我建议您改用 Entity Framework 提供的同步 API,因为您实际上不会享受异步调用带来的可扩展性。

编辑:

在评论中,你问:

As i am currently doing with hangefire eliminate the async effect ? if yes then will it be better to use sync methods instead ? or using sync or async with hangeffire will be exactly the same

首先,您必须了解异步的好处是什么。你不这样做是因为它很酷,你这样做是因为它有目的。那是什么目的?能够在负载下扩展。它是如何做到的?当您 await 一个异步方法时,控制权将返回给调用者。例如,你有一个传入的请求,你查询你的数据库。您可以坐在那里等待查询完成,也可以重新使用该线程来处理更多的请求。这才是真正的力量。

如果您实际上不打算接收大量请求(这样您就会耗尽线程池),您实际上看不到异步的任何好处。目前,您实现它的方式不会看到任何这些好处,因为您正在阻止异步调用。您可能会看到的只是死锁。

关于c# - 调用异步方法时使用 .Wait() 的情况是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32655143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com