【发布时间】:2015-12-15 18:53:57
【问题描述】:
我的 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调度程序中调用异步TASK。
那么当我使用.Wait() 调用异步方法时会发生什么?整个方法的操作会以同步方式完成吗?例如,如上所示,我在ScanAsync() ;SingleOrDefualtAsync,ToListAsync 和SaveChangesAsync 中有三个异步操作,所以它们会以同步方式执行,因为我正在使用 .wait() 调用 ScanAsync 方法?
【问题讨论】:
-
不能这样称呼吗?
RecurringJob.AddOrUpdate(async () => await ss.ScanAsync(), Cron.Minutely); -
我认为您需要做的一件事是检查任务是否有异常。像这样:
var task = ScanAsync("test"); task.Wait(); if(task.Exception != null) {throw task.Texception};如果你不这样做,你可能不会发现你的后台工作是否有异常。 -
@Igor 不,Hangfire 特别不支持直接执行异步方法。见this issue。
-
@Igor 它会引发一个错误,在这种情况下是 Startupclass,其中“RecurringJob.AddOrUpdate(async () => await ss.ScanAsync(), Cron.Minutely);”定义将需要是一个异步任务,它不起作用,因为我不能在非异步任务方法中使用等待
标签: c# asynchronous asp.net-mvc-5 async-await entity-framework-6