2016-11-08 4 views
-1

Сценарий (-ы) ниже 2, какой из них является правильным способом выполнения асинхронного программирования в C#?Async - Какая из них правильная

Сценарий-1

public async Task<T1> AddSomethingAsync(param) 
{ 
    return await SomeOtherFunctionFromThirdPartyLibraryForIOAsync(param); 
} 

затем

List<Task> Tasks=new List<Task>(); 
foreach(var task in FromAllTasks()) 
{ 
    Tasks.Add(AddSomethingAsync(task)); 
} 
await Task.WhenAll(Tasks.AsParallel()); 

Сценарий-2

public async Task<T1> AddSomethingAsync(param) 
{ 
    return SomeOtherFunctionFromThirdPartyLibraryForIOAsync(param); 
} 

затем

List<Task> Tasks=new List<Task>(); 
foreach(var task in FromAllTasks()) 
{ 
    Tasks.Add(SomeOtherFunctionFromThirdPartyLibraryForIOAsync(task)); 
} 
await Task.WhenAll(Tasks.AsParallel()); 

Единственная разница между 2, позже не имеет await ключевое слово внутри AddSomethingAsync функция.

Итак, это обновление. Что я хочу знать, чтобы достичь, все задачи должны выполняться параллельно и асинхронно. (Мое мышление в сценарии-1, то вызов будет ожидаться в AddSomethingAsync и повредит в верхнем слое блокирования следующего цикла для выполнения. подтверждения

+3

'Tasks.AsParallel'? Я не думаю, что вы знаете, что делает «AsParallel». Просто используйте 'waitait.WhenAll (Tasks);'. Даже если ваши функции не являются асинхронными, «AsParallel» будет слишком поздно для вечеринки. – Luaan

+0

@ Luaan, можете ли вы поделиться своими мыслями о «поздней вечеринке»? –

+3

Вы не распараллеливаете что-либо, вызывая 'AsParallel' на перечисляемом и перечислив его. PLINQ может помочь вам только в том случае, если данные, которые вы производят, ленивы - в вашем случае вся работа уже выполнена (вызов 'AddSomethingAsync'). – Luaan

ответ

6

Сценарий 3

public Task<T1> AddSomethingAsync(param) 
{ 
    return SomeOtherFunctionFromThirdPartyLibraryForIOAsync(param); 
} 

затем

List<Task> Tasks=new List<Task>(); 
foreach(var task in FromAllTasks()) 
{ 
    Tasks.Add(SomeOtherFunctionFromThirdPartyLibraryForIOAsync(task)); 
} 
await Task.WhenAll(Tasks); 

Если вы ничего не ожидаете - вам не нужно ключевое слово async. Doing AsParallel ничего не сделает и в этом случае.

-1

По-моему, это то же самое. await - это знак, означающий, что эта строка выполняется в том же потоке с помощью этого метода, она будет ждать в потоке.
Фактически async и await - это дизайн для метода return void. поэтому, если этот метод не возвращает результат, его можно поместить только в поток. Любой метод async, называемый этим методом, означает, что он будет использовать один и тот же поток с методом void, если этот метод должен получить результат await, это ожидание внутри этой темы.
И когда вы помещаете их в List<Task>, это не имеет значения.

+0

В настоящее время метод возвращает объект, но он бесполезен. –

+0

вам нужно понять, в какой ситуации следует использовать 'async & await'. Я написал блог [здесь] (http://www.cnblogs.com/xianyudotnet/p/5716908.html) об этом, вы можете прямо перейти к разделу «Async & await & Task», это не на английском, но вы можете проверить результат эксперимента или перевод Google. – Bucketcode

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