В первом фрагменте кода вы даже не , начиная с, второй вызов службы до тех пор, пока не завершится первый вызов службы (а также не начнется третий до завершения второго). Короче говоря, они выполняются последовательно.
Во втором фрагменте вы запускаете все три вызова службы, но затем не продолжайте в коде до тех пор, пока все три не будут выполнены. Короче говоря, все они выполняются параллельно.
Если второй/третий вызовы не могут быть начались, пока они не получили результат предыдущей операции, тогда вам нужно будет сделать что-то вроде первого фрагмента, чтобы заставить его работать. Если вызовы службы не зависят друг от друга вообще, тогда вы хотите, чтобы они выполнялись параллельно по соображениям производительности.
Если по какой-то причине вам не нравятся дополнительные локальные переменные, существуют другие способы параллельного выполнения задач с использованием альтернативных синтаксисов. Один из вариантов, который будет действовать как ваш второй вариант является:
var Data = await Task.WhenAll(WebService1.Call(),
WebService2.Call(),
WebService3.Call());
Если это не проблема с копией, я не вижу причин, по которой достойный компилятор не будет оптимизировать дополнительное назначение. Хотя я не знаю достаточно о C#, чтобы сказать наверняка. Возможно, это всего лишь семантическая проблема, и ваша команда предпочитает четко указывать, что вызов является задачей, а результатом задачи являются данные? – JAB
@JAB Это неправда. В семантическом значении этих двух фрагментов кода есть * драматическая * разница. – Servy
@servy, какова ваша семантика для семантики? – nicolas