2016-03-20 32 views
-2

için ben de, sonuç yazdırmadan önce döngü tamamlamak istiyorum:C# Threading içeride döngü

 for (int i = 0; i < 5; i++) 
     { 
      (new System.Threading.Thread(() => 
       { 
        if (TimeTakingMethod()) 
        { 
         ++nResult; 
        } 
       })).Start(); 
     } 
     Console.WriteLine("Count = " + nResult); 

ancak bu konu baskı ana iş parçacığı üzerinde yapılır, çünkü bitmesini Console.WriteLine beklemeyecek . Ben bunu değiştirirseniz

:

 System.Threading.Thread t = new System.Threading.Thread(() => 
      { 
       for (int i = 0; i < 5; i++) 
       { 
        (new System.Threading.Thread(() => 
        { 
         if (TimeTakingMethod()) 
         { 
          ++nResult; 
         } 
        })).Start(); 
       } 
      }); 
     t.Start(); 
     t.Join(); 
     Console.WriteLine("Count = " + nResult); 

iç içe ipler bekledi olmayacak çünkü hala sorunu çözmez.

Bunun için basit bir çözüm var mı? Bunun için teşekkürler.

+2

Böyle iş parçacıkları kullanmanın amacı nedir? zaten bitirene kadar bekleyeceksin ... – Idos

+0

Gözlemsel mantık? Ne yaptığını ve nedenini açıklamanı öneririm? Açık bir sebep olmaksızın iç içe geçmiş iş parçacıkları – Saleem

+0

Idos ve Saleem, beklemenin nedeni, sonuç yalnızca döngü işleminden sonra yazdırılması gerektiğidir. Orada iş parçacığı kullandım çünkü döngüdeki her yineleme zaman alıyor. Soru sütununda verdiğim açıklama, karmaşık bir görevin çok basitleştirilmiş bir versiyonudur, bu yüzden bu soru, programın çoklu okumaya ihtiyaç duymayacağına benzeyebilir. Crashmstr, Katılıyorum, bunun için teşekkürler. Bu sayfada yazılanlar aşağıdaki sayfada verilen diğer cevaplarla birlikte yardımcı oldu: List threads = new List (); // Bu koleksiyona üyelerinizi ekleyin threads.WaitAll(); –

cevap

0

Oluşturulan konuları denetlemek için depolamalısınız, bir Liste kullandım.

 int nResult = 0; 
     List<Thread> threads = new List<Thread>(); 

     for (int i = 0; i < 5; i++) 
     { 

      Thread thread = new System.Threading.Thread(() => 
      { 
       if (TimeTakingMethod()) 
       { 
        ++nResult; 
       } 
      }); 
      thread.Start(); 
      threads.Add(thread); 
     } 

     foreach (Thread thread in threads) 
      thread.Join(); 

     Console.WriteLine("Count = " + nResult); 
0

Bunu nasıl bir örnek: nota

int result = 0; 
Task.WaitAll(Enumerable.Range(0, 5) 
    .Select(index => Task.Factory.StartNew(() => 
    { 
     // Do thread things... 
     Interlocked.Increment(ref result); 
    })).ToArray()); 

Console.WriteLine(result); 

iki önemli şey olan tüm görevleri WriteLine çağrısına geçmeden önce tamamlamak için programın beklemesine neden olur Task.WaitAll .

Ayrıca Interlocked.Increment, herhangi bir iş parçacığının sonucunu güvenli bir şekilde artırmanıza izin verecektir.