使TaskCompletionSource <t> .Task从asp.net mvc请求后台运行</t>

时间:2014-01-21 03:33:01

标签: c# asp.net-mvc-4 taskcompletionsource

在我的MVC 4应用程序的一个动作中,我有一个电话:

public ActionResult Test()
{
   DownloadAsync("uri","file path");
   return Content("OK");
}

DownloadAsync返回一个任务,我希望在后台看到DownloadAsync运行。但我总是看到MVC仅在Task DownloadAsync完成时才响应(意味着需要在响应之前等待下载完成)。如果我将异步调用包装到Task.Run()Task.Factory.StartNew(),那么它可以满足我的期望。这是方法DownloadAsync

private Task DownloadAsync(string url, string originalFile)
{
    var tsc = new TaskCompletionSource<bool>();

    var client = new WebClient();
    AsyncCompletedEventHandler completedHandler = null;
    completedHandler = (s, e) =>
    {
        var wc = (WebClient)s;
        wc.DownloadFileCompleted -= completedHandler;

        if (e.Cancelled)
        {
            tsc.TrySetCanceled();
        }
        else if (e.Error != null)
        {
            tsc.TrySetException(e.Error);
        }
        else
        {
            tsc.SetResult(true);
        }
        wc.Dispose();
    };
    client.DownloadFileCompleted += completedHandler;
    client.DownloadFileAsync(new Uri(url), originalFile);

    return tsc.Task;
}

所以我的问题是:

  1. 为什么MVC请求需要等待完成任务? Task创建的TaskCompletionSource<T>是否有任何特殊内容?

  2. 如何让Task DownloadAsync在后​​台运行而不会暂停MVC请求的响应?

  3. 谢谢,

0 个答案:

没有答案