MVC异步,无需等待任务完成

时间:2012-11-09 11:03:44

标签: asp.net-mvc asp.net-mvc-3 c#-4.0 asynchronous

我发出一个ajax请求来调用控制器动作,如下所示:

控制器:

    [AsyncTimeout(8000, Order = 3)]
    [HandleError(ExceptionType = typeof(TimeoutException), Order = 4, View = "TimeoutError")]
    public async Task<JsonResult> RemovePackageAsync(CancellationToken cancellationToken, string packageId, ICollection<int> ids)
    {
        PackageRemoveItem removeItem = new PackageRemoveItem()

        .............blah blah blah

        await this.deviceRepository.RemovePackageAsync(removeItem);
        return  this.Json(JsonConvert.SerializeObject(removeItem.Machines));
    }

方法:

    public async Task RemovePackageAsync(PackageRemoveItem removeItem, CancellationToken cancelToken = default(CancellationToken))
    {
        await Task.Run(() =>
        {
            int[] machines = removeItem.Machines.Keys.ToArray();
            .......


        });
    }

然而,当我在调试中运行它时,我的ajax响应会一直等到我的“RemovePackageAsync”结束。我在这里尝试实现的是在不同的线程上调用此方法,让它执行,而不是等待它完成,但是要立即从控制器获得“真正的”响应。

ajax call =&gt; controller =&gt;在新线程上调用方法,不要等待它完成但是返回true =&gt; let方法只要需要就运行。然后我会做其他的事情

1 个答案:

答案 0 :(得分:3)

异步控制器只在内部 Web服务器中工作,以从线程池中释放线程来处理并发请求。浏览器仍然等待同步,以便您的操作返回结果。

你需要的是一个标准的控制器动作,它只产生一个线程或任务并立即返回。

但是这样你就无法返回任何结果数据。