4

kullanılarak belirsiz sonucun ben Görev Paralel sınamak için bu kodu C# zaman uyumsuz programlama hakkında öğrenme ve yazılı ediyorum Kütüphanesi (Konsol uygulaması):Görevler - Rastgele

static void Main(string[] args) 
{ 
    Stopwatch sw = new Stopwatch(); 

    var opr1 = new SlowOperation(); 
    var opr2 = new SlowOperation(); 

    //TASK 
    Console.WriteLine("Started processing using TASK. Start: {0}", sw.Elapsed); 
    sw.Start(); 

    Task.Factory.StartNew(() => opr1.PerformSlowOperation(1)); 
    Task.Factory.StartNew(() => opr2.PerformSlowOperation(2)); 

    Console.WriteLine("Stopped processing using TASK. Stop: {0}", sw.Elapsed); 
    sw.Stop(); 

} 

yavaş bir işlemdir:

public class SlowOperation 
{ 
    public void PerformSlowOperation(int id) 
    { 
     var rand = new Random(); 
     double sum = 0; 

     for (int i = 0; i < 100000000; i++) 
     { 
      var number = Convert.ToDouble(rand.Next(100))/100; 
      sum += number; 
     } 
     Console.WriteLine("Finished processing operation no. {0}. Final sum calculated is: {1}", id, sum.ToString("0.##")); 
    } 
} 

Herkes, SlowOperation sınıfının her bir örneğinin neden toplamının aynı olduğunu anlamak için bana yardımcı olabilir mi? Düşük çözünürlüğe bağlı olarak zamana dayalı olarak tohumlanır.

+0

Neden bir sürü görev başlatacak ve hemen kronometrenizi devre dışı bırakacak ve bitmeden bitirdiklerini söyleyebildiniz diyenler * bitirmeleri için * bekledikleri için? –

cevap

2

. Bu klasik bir sorundur ve aklımda bir API tasarım hatasıdır. Bence bu zaten CoreCLR Repo'da değişti.

new Random().Next() == new Random().Next() neredeyse her zaman doğrudur.

Ayrıca, sorunun kodunun% 95'inin sorunla ilgisi olmadığını unutmayın. Gelecekte, sadece rastgele arama sona erinceye kadar kodu kendiniz basitleştirebilirsiniz. Bu, bu tür sorunları kendiniz bulmanızı sağlar.

2

Her görevde farklı bir tohum değeriyle ayarlayın. Örneğin:

var rand = new Random(new System.DateTime().Millisecond + id); 

Rastgele construtor: benzersiz çekirdek değeri etmektir üretmek için

uygulamanız farklı rastgele sayı dizileri gerektiriyorsa https://msdn.microsoft.com/pt-br/library/ctssatww(v=vs.110).aspx, farklı tohum values.One yolu ile art arda bu yapıcı çağırmak Zaman bağımlı olarak.Örneğin, sistem saatinden tohum değerini türetmek.Ancak, sistem saati farklı bir se ile bu kurucunun farklı çağırma sağlamak için yeterli çözünürlüğe sahip olmayabilir. ed değeri.

+2

Yeni rastgele (yeni System.DateTime(). Millisecond) çağrılması, 'yeni Random()' çağrısından farklı değil. Altta yatan hala milisaniye dayanmaktadır. – Enigmativity

+0

Haklısınız. Talihsiz bir örnek verdim, cevabımı düzenleyeceğim ve bu Örneği kaldıracağım. –