当await语句返回时,async方法不会继续

时间:2013-07-29 07:45:40

标签: 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 generalHubContext = GlobalHost.ConnectionManager.GetHubContext<GeneralHub>();
        generalHubContext.Clients.Client(connectionId).showNotification("Completed");
    }

“DoWork”方法是我的mvc动作。我打算做的是当按下操作按钮时,“DoWork”调用异步方法并立即返回到客户端。当异步方法完成其工作时,它将使用signalR通知客户端。

问题在于“MakeADelayAsync”方法,await之后的那两行不会被调用。似乎在等待之后流程永远不会继续。

第一个问题是“MakeADelayAsync”中的问题在哪里?

第二个问题是为什么我必须写一个无用的var a = MakeADelayAsync();代码来避免编译器警告,而我完全知道我在做什么?反正我从不使用“a”。

2 个答案:

答案 0 :(得分:1)

  

“DoWork”方法是我的mvc动作。我打算做的是当按下操作按钮时,“DoWork”调用异步方法并立即返回到客户端。当异步方法完成其工作时,它将使用signalR通知客户端。

这样做非常危险。我强烈建议您使用持久性队列,正如我在previous answer:Azure队列,MSMQ,WebSphere MQ等中所述。

但是,如果您坚持以危险的方式执行此操作,那么您可以使用我在博客上的代码execute background work on ASP.NET outside of a request context

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());
}
  

第一个问题是“MakeADelayAsync”中的问题在哪里?

在请求完成并处理请求上下文后,您正在执行尝试在请求上下文中恢复的代码。这是same problem you had before

  

第二个问题是为什么我要写一个无用的var a = MakeADelayAsync()代码;在我完全清楚自己在做什么的时候避免编译警告?

编译器警告告诉你代码几乎肯定是一个错误......编译器是对的。

答案 1 :(得分:0)

您可以尝试将DoWork方法标记为async吗?

public async void DoWork(string connectionId)
    {
        connectionId = this.connectionId;
        var a = MakeADelayAsync();
    }