Использование Task.Run в синхронном контроллере asp.net

Есть ли эффективный способ загрузить файл и сохранить его на диск в «фоновом» режиме, не блокируя текущее выполнение действия в контроллере mvc?

В настоящее время у меня работает следующий пример кода:

    public ActionResult Index()
    {
        InitiateDownload();

        var model = GetModel();
        return View(model);
    }

    private void InitiateDownload()
    {
        Task.Run(() => DownloadAndSaveFileAsync()).ConfigureAwait(false);
    }
    private async Task DownloadAndSaveFileAsync()
    {
        var response = await GetResponse();

        using (var fileStream = new FileStream("c:\\file.zip", FileMode.Create, FileAccess.Write, FileShare.None))
        {
            await response.Content.CopyToAsync(fileStream).ConfigureAwait(false);
        }
    }
    public async Task<HttpResponseMessage> GetResponse()
    {
        var client = new HttpClient();
        client.BaseAddress = new Uri("http://someUrl.com");

        return await client.GetAsync("someResourceEndPoint").ConfigureAwait(false);
    }

Я прочитал несколько мест, где вы не должны использовать Task.Run на сервере (в рабочем потоке), поэтому мне было интересно, является ли этот пример масштабируемым (например, если он получает 10 запросов каждую секунду) или надежным, или есть ли какие-либо подходящие способ сделать это так?

Спасибо


person Vindberg    schedule 28.03.2014    source источник
comment
используйте очередь для обработки задач, чтобы быть в безопасности   -  person Ramie    schedule 28.03.2014


Ответы (1)


person    schedule
comment
Спасибо, Стивен, я буду использовать BackgroundTaskManager. Его не беспокоит, если задача терпит неудачу. Откройте файловый поток для асинхронного доступа. Вы имеете в виду добавление параметра useAsync:true в новый FileStream(...)? - person Vindberg; 28.03.2014
comment
Да, useAsync откроет файл для асинхронного доступа. - person Stephen Cleary; 28.03.2014
comment
@StephenCleary, в каком пространстве имен я могу найти BackgroundTaskManager? - person GibboK; 12.06.2014
comment
Код теперь находится на GitHub, но обратите внимание, что .NET 4.5.2 представил HostingEnvironment.QueueBackgroundWorkItem, что почти точно тоже самое. - person Stephen Cleary; 12.06.2014