2008-08-09 15 views
8

.NET CF 2.0'da bir iş parçacığı başlatmaya ilişkin bazı kodum var:Devam etmeden önce iş parçacığı nasıl tamamlanır?

ThreadStart tStart = new ThreadStart(MyMethod); 
Thread t = new Thread(tStart); 
t.Start(); 

Bunu bir döngü içinde çağırırsam, öğeler sıra dışı olur. Xzx10'dan sonra bir bekleme nasıl yapılır, böylece koddaki çalışma, kodun devam etmesinden önce tamamlanır? BeginInvoke/EndInvoke, iş parçacığı el ile oluşturmaktan daha iyi bir seçenek mi olacak?

cevap

9

ne kadar sırası parçacığı üzerinde empoze etmek gerekiyor? Kodun devam etmesinden önce bitmek üzere döngüde başlayan tüm çalışmalara gereksiniminiz varsa, ancak döngü içindeki çalışmayı tamamlama emrini almazsanız, birleştirme yanıtıdır. Kevin Kenny's answer,'a daha fazla ayrıntı eklemek için, döngüsünün dışına 'a katılmalısınız. Bu Başladığınız parçacığı başvurular tutacak bir koleksiyon gerekir gelir: Eğer döngü içine katıl denilen hiç değilse konuları kullanmayan olarak

// Start all of the threads. 
List<Thread> startedThreads = new List<Thread>(); 
foreach (...) { 
    Thread thread = new Thread(new ThreadStart(MyMethod)); 
    thread.Start(); 
    startedThreads.Add(thread); 
} 

// Wait for all of the threads to finish. 
foreach (Thread thread in startedThreads) { 
    thread.Join(); 
} 

aksine, sonuç temelde aynı olacaktır. Döngü gövdesinin her yinelemesi bir iş parçacığı oluşturacak ve başlatacak, ancak hemen birleştirme işlemini başlatacak ve bitirmesini bekleyecektir.

Tekil parçacıklar bir sonuç çıkarırsa (örneğin bir günlüğüne bir mesaj yazarsanız), iş parçacıkları arasında koordinasyon olmadığından iletiler hala görünmeyebilir. Konuları bir Monitör ile koordine ederek sonuçlarının çıktısını almak mümkündür.

2

Bunu düzgün okuyorsam, iş parçacıklarını iş parçacıkları üzerinde başlatıyorsunuz, ancak iş parçacıklarının düzenin tamamlanmamasından endişe duyuyorsunuz ve her bir iş parçacığı siparişi tamamlayana kadar beklemeyi tercih ediyorlar başlatıldı

Bu durumda, neden iş öğesi başına bir iş parçacığı oluşturduğunuzu bilmiyorum. Belki genişleyebilirsin?

tamamlamak için iş parçacığı için beklemek gerek yoktu Eğer yapabilsek:

t.Join(); 
4

Bir iş parçacığının bitmesini beklemenin başka bir yolu da AutoResetEvent kullanıyor.

private readonly AutoResetEvent mWaitForThread = new AutoResetEvent(false); 

private void Blah() 
{ 
    ThreadStart tStart = new ThreadStart(MyMethod); 
    Thread t = new Thread(tStart); 
    t.Start(); 

    //... (any other things) 
    mWaitForThread.WaitOne(); 
} 

private void MyMethod() 
{ 
    //... (execute any other action) 
    mWaitForThread.Set(); 
} 
İlgili konular