Сделайте так, чтобы 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;
}

Итак, мой вопрос:

  1. Почему в этом случае MVC-запрос нужно ждать завершения задачи? Есть ли специальные Task создано TaskCompletionSource<T>?

  2. Как сделать Task из DownloadAsync запустить в фоновом режиме без паузы ответ на запрос MVC?

Спасибо,

0 ответов

Другие вопросы по тегам