2014-12-18 1 views
2

Я изо всех сил пытаюсь понять преимущества async vs sync, когда он работает в не визуальном контексте, например. лазурь работник или веб-контроллер Api:Понимание async с WebClient UploadString() vs UploadStringTaskAsync

using (var wc = new WebClient()) 
{ 
    wc.UploadString(uri, message); 
    // vs. 
    await wc.UploadStringTaskAsync(uri, message); 
} 

ли не основной поток нужно ждать в любом случае, и, следовательно, не имеет никакого значения для работы? Что еще есть, кроме рабочих мест UI?

ответ

3

Это правда, что даже если вы используете async, там есть какой-то основной поток. Преимущества в том, что вы можете одновременно выполнять несколько асинхронных операций, не блокируя нити. Это увеличивает вашу масштабируемость, поскольку вы можете обрабатывать больше работы с меньшими ресурсами.

Предположим, что вместо одного WebClient вы используете 1000. По-прежнему есть основной поток, но вместо блокировки 1000 потоков больше на IO, вы не используете ни одного.

public Task Upload(string message) 
{ 
    using (var wc = new WebClient()) 
    { 
     wc.UploadString(uri, message); 
     // vs. 
     await wc.UploadStringTaskAsync(uri, message); 
    } 
} 

await Task.WhenAll(messages.Select(message => Upload(message))) // multiple operations. 0 blocked threads. 
+0

Это означает, что с одной операцией и никакими дополнительными потоками не создается, не так ли? –

+0

@BenjaminE. Если для всего вашего приложения требуется только 1 поток, и отзывчивость не является проблемой, то да, нет никакой реальной разницы. Но большинство приложений, особенно серверных приложений, не используют только один поток. – i3arnon

+0

OK, учитывая контроллер Wep Api, который использует один экземпляр для запроса, выполняет ли async любые ресурсы обратно в threadpool или этот экземпляр контроллера держится в потоке? –

5

Не следует ли в любом случае ожидать, что основная нить должна ждать, и, следовательно, не имеет значения разница в производительности? Что еще есть, кроме рабочих мест UI?

Когда вы используете веб-API, например, threadpool ASP.NET дает вам поток, в который вы запускаете свой код. Когда вы используете await асинхронный метод, вы возвращаете этот поток обратно в пул, чтобы разрешить обработку большего количества подключений. Метод async дает управление обратно вызывающему методу (или если он является обработчиком верхнего уровня, в threadpool), и теперь этот поток может обрабатывать больше работы. Хотя в синхронной версии вы просто блокируете поток до тех пор, пока IO не завершится.

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

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