3

我正在使用 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”。

4

2 回答 2

1

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

这样做是极其危险的。我强烈建议您使用持久队列,正如我在之前的回答中所说:Azure 队列、MSMQ、WebSphere MQ 等。

但是,如果您坚持以危险的方式进行操作,那么您可以使用我博客上的代码在请求上下文之外在 ASP.NET 上执行后台工作

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”中的问题在哪里?

您正在执行的代码尝试在请求完成并释放请求上下文后在请求上下文上恢复。这和你之前遇到的问题一样

第二个问题是为什么我必须编写 var a = MakeADelayAsync(); 的无用代码?在我完全知道自己在做什么的同时避免编译器警告?

编译器警告告诉您代码几乎可以肯定是一个错误......并且编译器是正确的。

于 2013-07-29T12:18:49.117 回答
0

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

public async void DoWork(string connectionId)
    {
        connectionId = this.connectionId;
        var a = MakeADelayAsync();
    }
于 2013-07-29T08:32:03.063 回答