Koleksiyonda bazı çalışmalar yapan eşzamansız bir konsol uygulaması oluşturmaya çalışıyorum. Döngüyü/uyumlamayı kullanan başka bir sürüm için döngü için paralel kullanan bir sürümüm var. Async/await versiyonunun paralel versiyona benzer şekilde çalışmasını bekledim ama senkronize olarak çalışıyor. Neyi yanlış yapıyorum?Bir döngüde bekletme süresi nasıl kullanılır
class Program
{
static void Main(string[] args)
{
var worker = new Worker();
worker.ParallelInit();
var t = worker.Init();
t.Wait();
Console.ReadKey();
}
}
public class Worker
{
public async Task<bool> Init()
{
var series = Enumerable.Range(1, 5).ToList();
foreach (var i in series)
{
Console.WriteLine("Starting Process {0}", i);
var result = await DoWorkAsync(i);
if (result)
{
Console.WriteLine("Ending Process {0}", i);
}
}
return true;
}
public async Task<bool> DoWorkAsync(int i)
{
Console.WriteLine("working..{0}", i);
await Task.Delay(1000);
return true;
}
public bool ParallelInit()
{
var series = Enumerable.Range(1, 5).ToList();
Parallel.ForEach(series, i =>
{
Console.WriteLine("Starting Process {0}", i);
DoWorkAsync(i);
Console.WriteLine("Ending Process {0}", i);
});
return true;
}
}
Diğerleri hakkında bilmiyorum, ama foreach for parallel for parallel döngüler için daha düz görünüyor. – Brettski
Görev bittiğinde, "Bitiş Süreci" bildiriminin ** görünmediğini unutmayın. Tüm bu bildirimler, görevlerin son * bitmesinden hemen sonra sıralı olarak bırakılır. Süreç 1'i sonlandırdığımızda, süreç 1 uzun bir süredir bitmiş olabilir. Orada kelime seçiminden başka, +1. –
@Brettski Yanlış olabilir, ancak paralel döngü, herhangi bir asenkron sonucu yakalar. Bir Görev'u döndüğünüzde, onu iptal etmek veya istisnaları görmek gibi içerideki işleri yönetebileceğiniz bir Görev nesnesini hemen geri alırsınız. Artık Async/Await ile Görev nesnesini daha samimi bir şekilde çalıştırabilirsiniz - Task.Result yapmak zorunda değilsiniz. –