Сделайте так, чтобы TaskCompletionSource<T>.Task запускался в фоновом режиме из запроса mvc asp.net.
В одном действии моих приложений 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?
Спасибо,