Подтвердить что ты не робот

Методы Task.Factory.StartNew и Async

Может быть, тривиальный вопрос, но он может помочь мне в основном понимании.

Есть ли какое-либо важное различие между двумя следующими реализациями?

  • Task.Factory.StartNew:

    public Task<string> ReadAllTextAsync(string path) {
        return Task.Factory.StartNew(() => File.ReadAllText(path));
    }
    
  • Асинхронный метод на StreamReader:

    public async Task<string> ReadAllTextAsync(string path) {
        using (var stream = File.OpenRead(path))
        using (var reader = new StreamReader(stream)) {
            return await reader.ReadToEndAsync();
        }
    }
    
4b9b3361

Ответ 1

Да, существует решающее различие: Task.Factory.StartNew не сохраняет контекст синхронизации, тогда как при использовании async/await этот контекст сохраняется. Например, в приложении ASP.NET это означает, что если вы используете Task.Factory.StartNew, HttpContext может быть недоступен внутри задачи, тогда как если вы используете async/await, он будет доступен.

Там также есть еще одно важное отличие от приведенного вами примера. В первом случае вы используете блокирующий API: File.ReadAllText(path), тогда как во втором случае вы используете порт завершения ввода-вывода с истинной асинхронной операцией ввода-вывода. Это означает, что в первом случае вы ставите под угрозу поток, на котором эта задача выполняется в течение всего времени выполнения этой задачи, тогда как во втором случае этот поток является бесплатным благодаря порту завершения ввода/вывода.