在我的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;
}
所以我的问题是:
为什么MVC请求需要等待完成任务? Task
创建的TaskCompletionSource<T>
是否有任何特殊内容?
如何让Task
DownloadAsync
在后台运行而不会暂停MVC请求的响应?
谢谢,