在我的 MVC 4 应用程序的一个操作中,我有一个电话:
public ActionResult Test()
{
DownloadAsync("uri","file path");
return Content("OK");
}
DownloadAsync
返回一个任务,我希望看到DownloadAsync
在后台运行。但我总是看到 MVC 仅在Task
ofDownloadAsync
完成时响应(意味着需要等待下载完成才能响应)。如果我将异步调用包装在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;
}
所以我的问题是:
在这种情况下,为什么 MVC 请求需要等待完成任务?
Task
created by有什么特别的TaskCompletionSource<T>
吗?如何使
Task
ofDownloadAsync
在后台运行而不暂停 MVC 请求的响应?
谢谢,