Bu PLINQ için bir iş gibi görünüyor 'Kendi rulo' konusunda size ilham olacak:
return source.AsParallel().Select(s => ExecuteOrDownloadSomething(s));
Bu kısa sürede tamamlanır tamamlanmaz her sonucu dönen, iş parçacığı sınırlı sayıda kullanılarak paralel olarak temsilci çalıştırır. ExecuteOrDownloadSomething()
yöntem IO bağlı ise
(örn aslında bir şey indirebilir) ve async
kullanarak sonra, konuları atık istemiyorum - mantıklı olabilir await
, ama daha karmaşık olacaktır.
async
'dan tam olarak yararlanmak istiyorsanız, IEnumerable
döndürmemelisiniz, çünkü bu eşzamanlıdır (yani, herhangi bir öğe yoksa bloklar). Ne gerek asenkron koleksiyon çeşit, ve kullanabileceğiniz ISourceBlock
(özellikle TransformBlock
) bunun için TPL veri akışı den: kaynağıdır
ISourceBlock<TDst> Foo<TSrc, TDest>(IEnumerable<TSrc> source)
{
var block = new TransformBlock<TSrc, TDest>(
async s => await ExecuteOrDownloadSomethingAsync(s),
new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = DataflowBlockOptions.Unbounded
});
foreach (var item in source)
block.Post(item);
block.Complete();
return block;
}
ise “yavaş” (yani sonuçlarını işlemeye başlamak istiyorum Foo()
, source
yinelenen tamamlandı), foreach
ve Complete()
çağrıyı ayrı bir Task
'a taşımak isteyebilirsiniz. Daha da iyi bir çözüm, source
'u ISourceBlock<TSrc>
'a da yapmak olabilir.
tarafından desteklendiğini düşünürüm, ama bu sorunun nasıl çözüleceğine dair bir örnek verebilir misiniz? Teşekkürler! – Yurik
@Yurik Neden bunu istiyorsun açıklar mısınız? – svick
Çoğunlukla, "async 101" değil, gerçek bir dünya senaryosu olan yeni bir problemin söz dizimini beklememde yardımcı olacağını düşündüğümden. – Yurik