0

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

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

DownloadAsync返回一个任务,我希望看到DownloadAsync在后台运行。但我总是看到 MVC 仅在TaskofDownloadAsync完成时响应(意味着需要等待下载完成才能响应)。如果我将异步调用包装在Task.Run()orTask.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 请求需要等待完成任务?Taskcreated by有什么特别的TaskCompletionSource<T>吗?

  2. 如何使TaskofDownloadAsync在后台运行而不暂停 MVC 请求的响应?

谢谢,

4

0 回答 0