【发布时间】:2013-07-29 20:18:49
【问题描述】:
我正在使用 MVC 4,我有以下代码:
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");
}
“DoWork”方法是我的 mvc 操作。我打算做的是当按下操作按钮时,“DoWork”调用异步方法并立即返回客户端。当异步方法完成他的工作时,它将使用 signalR 通知客户端。
问题出在“MakeADelayAsync”方法中,await 之后的那两行永远不会被调用。似乎等待之后流程永远不会继续。
第一个问题是“MakeADelayAsync”的问题在哪里?
第二个问题是为什么我必须编写var a = MakeADelayAsync(); 的无用代码以避免编译器警告,而我完全知道自己在做什么?反正我从不使用“a”。
【问题讨论】:
-
尝试在线程池上启动任务。
Task.Factory.StartNew(MakeADelayAsync, TaskScheduler.Default)之类的东西(取自记忆,可能是错误的签名)。 -
Alex,感谢您提供帮助的意图,但不,这不是答案。即使它会起作用,它也不能解释为什么 await 不会返回!
-
之所以没有继续下去,可能是因为调度器是基于请求的,在等待完成之前请求已经结束。因此,它不会在您的延迟(或延迟本身被取消)之后调用延续。在 ThreadPool 上运行应该断开您的方法调用与请求上下文的连接。至少理论上是这样的。