Asp.net mvc 4 当WAIT语句返回时,异步方法不继续
我使用的是MVC 4,我有以下代码:Asp.net mvc 4 当WAIT语句返回时,异步方法不继续,asp.net-mvc-4,async-await,Asp.net Mvc 4,Async Await,我使用的是MVC 4,我有以下代码: public void DoWork(string connectionId) { connectionId = this.connectionId; var a = MakeADelayAsync(); } public async Task MakeADelayAsync() { await Task.Delay(5000); var genera
public void DoWork(string connectionId)
{
connectionId = this.connectionId;
var a = MakeADelayAsync();
}
public async Task MakeADelayAsync()
{
await Task.Delay(5000);
var generalHubContext = GlobalHost.ConnectionManager.GetHubContext<GeneralHub>();
generalHubContext.Clients.Client(connectionId).showNotification("Completed");
}
public-void-DoWork(字符串连接ID)
{
connectionId=this.connectionId;
var a=makeadelayanc();
}
公共异步任务makeadelayanc()
{
等待任务。延迟(5000);
var generalHubContext=GlobalHost.ConnectionManager.GetHubContext();
generalHubContext.Clients.Client(connectionId).showNotification(“已完成”);
}
“DoWork”方法是我的mvc操作。我打算做的是,当按下操作按钮时,“DoWork”调用一个异步方法并立即返回到客户机。当异步方法完成其作业时,它将使用信号器通知客户端
问题是在“makeadelayanc”方法中,wait之后的这两行永远不会被调用。等待之后,这种流动似乎永远不会继续
第一个问题是“makeadelayanc”中的问题在哪里
第二个问题是为什么我必须编写一个无用的代码
var a=makeadelayanc()代码>在我完全知道自己在做什么时避免编译器警告?无论如何,我从不使用“a”。你能试着将你的DoWork
方法标记为async
吗
public async void DoWork(string connectionId)
{
connectionId = this.connectionId;
var a = MakeADelayAsync();
}
“DoWork”方法是我的mvc操作。我打算做的是,当按下操作按钮时,“DoWork”调用一个异步方法并立即返回到客户机。当异步方法完成其作业时,它将使用信号器通知客户端
这样做是非常危险的。我强烈建议您使用持久队列,正如我在我的文章中所说的:Azure队列、MSMQ、WebSphere MQ等
但是,如果您坚持以危险的方式进行操作,那么您可以使用我在博客上提供的代码:
第一个问题是“makeadelayanc”中的问题在哪里
您正在执行的代码试图在请求完成并释放请求上下文后在请求上下文上恢复。这是最重要的
第二个问题是为什么我必须编写一个无用的var a=makeadelayanc()代码;在我完全清楚自己在做什么的同时避免编译器警告
编译器警告告诉您代码几乎肯定是一个错误。。。编译器是正确的。尝试在线程池上启动任务。类似于Task.Factory.StartNew(makeadelaysync,TaskScheduler.Default)
(从内存中获取,可能是错误的签名)。Alex,我感谢您的帮助,但这不是答案。即使它能起作用,它也不能解释为什么等待不会回来!它没有继续的原因可能是因为调度程序是基于请求的,并且在等待完成之前请求已经结束。因此,它不会在延迟(或延迟本身被取消)后调用continuation。在线程池上运行应该断开methodcall与请求上下文的连接。至少这是理论。我不能将我的操作标记为异步,因为这将迫使我等待一个语句。在不等待的情况下添加async并不意味着什么。
public void DoWork(string connectionId)
{
connectionId = this.connectionId;
// This is extremely dangerous code! If ASP.NET unloads
// your app, then MakeADelayAsync may not run to completion.
BackgroundTaskManager.Run(() => MakeADelayAsync());
}