5

Я использую MVC4 ApiController для загрузки данных в Azure Blob. Вот пример кода:Использовать Task.Factory.StartNew в MVC 4 async ApiController?

public Task PostAsync(int id) 
{ 
    return Task.Factory.StartNew(() => 
    { 
     // CloudBlob.UploadFromStream(stream); 
    }); 
} 

Имеет ли этот код смысл? Я думаю, что ASP.NET уже обрабатывает запрос в рабочем потоке, поэтому запуск UploadFromStream в другом потоке не имеет смысла, поскольку теперь он использует два потока для запуска этого метода (я предполагаю, что исходный рабочий поток ожидает этого UploadFromStream чтобы закончить?)

Итак, я понимаю, что async ApiController имеет смысл только в том случае, если мы используем некоторые встроенные async-методы, такие как HttpClient.GetAsync или SqlCommand.ExecuteReaderAsync. Эти методы, вероятно, используют внутренние порты ввода/вывода, чтобы он мог освободить поток при выполнении фактической работы. Поэтому я должен изменить код на это?

public Task PostAsync(int id) 
{ 
    // only to show it's using the proper async version of the method. 
    return TaskFactory.FromAsync(BeginUploadFromStream, EndUploadFromStream...) 
} 

С другой стороны, если вся работа в методе сообщение является процессор/память интенсивно, то асинхронная версия PostAsync не поможет пропускной способности запросов. Может быть, лучше просто использовать обычный метод public public void Post (int id)?

Я знаю, что вопросов много. Надеюсь, это прояснит мое понимание использования асинхронного использования в ASP.NET MVC. Благодарю.

ответ

1

Да, большинство из того, что вы говорите, является правильным. Даже до деталей с портами завершения и т. Д.

Вот крошечная ошибка:

I assume the original worker thread is waiting for this UploadFromStream to finish?

только ваша задача нить работает. В конце концов, вы используете асинхронный конвейер. Он не дожидается завершения задачи, он просто подключает продолжение. (Также как с HttpClient.GetAsync).

Смежные вопросы