2009-05-17 2 views
0

У меня есть listoddata и список потоков в основном потоке. Я прохожу каждый элемент данных списка в соответствующий thread.want в основной поток, чтобы ждать, пока не будет выполнен весь поток.asp.net: вызов метода join для нескольких объектов потока?

for (int i = 0; i < listOfThread.Count; i++) 
      { 
       listOfThread[i].Join(); 

      } 
// code after all of thread completes its work 
//code block2 

, но после того, как первая итерация этого цикла основного потока не будет executed.and, если любой поток 0 завершается .code блок будет выполнен. который я не хочу.

ответ

3

Это совершенно правильный способ join на нескольких потоках. Если вы будете ждать на всех потоках, даже последовательно, это будет просто отлично. Ему не придется ждать по уже завершенным потокам. Если поток все еще запущен, он будет ждать завершения этого потока.

1

Sahil, чего вы пытаетесь достичь, убедившись, что соединение по всем нитям называется без необходимости ждать выполнения каждого из них? Если это для производительности, это не поможет, так как в любом случае, даже если вы вызываете thread.join для всех потоков, он должен дождаться завершения каждого потока, прежде чем продолжить.

В любом случае, если необходимо, то вот что я должен сказать:

Там нет прямого метода ожидания всех потоков в одном зЬтЬ. Вместо этого после некоторого R & D я придумал небольшой косвенный метод. Вместо инициализации потока и передачи ему ParameterizedThreadDelegate вы можете непосредственно выполнить BeginInvoke в ParameterizedThreadDelegate. И затем вы можете использовать WaitHandle.WaitAll, чтобы дождаться, пока все делегаты закончат выполнение, прежде чем продолжить.

Вот код:

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<ParameterizedThreadStart> listDelegates = new List<ParameterizedThreadStart>(); 
     listDelegates.Add(new ParameterizedThreadStart(DelegateEg.Print)); 
     listDelegates.Add(new ParameterizedThreadStart(DelegateEg.Display)); 

     List<WaitHandle> listWaitHandles = new List<WaitHandle>(); 

     foreach (ParameterizedThreadStart t in listDelegates) 
      listWaitHandles.Add(t.BeginInvoke("In Thread", null, null).AsyncWaitHandle); 

     WaitHandle.WaitAll(listWaitHandles.ToArray()); 

     Console.WriteLine("All threads executed"); 

     Console.Read(); 

    } 
} 

public class DelegateEg 
{ 
    public static void Print(object obj) 
    { 
     Console.WriteLine("In print"); 
     Console.WriteLine(obj); 
    } 

    public static void Display(object obj) 
    { 
     Console.WriteLine("In Display"); 
     Console.WriteLine(obj); 

    } 
} 
+0

спасибо, но я думаю, что я был глупым.paul рыбак прав. Уже работает хорошо. –

+1

да ... я подразумевал одно и то же ... в любом случае это было хорошо r & d для меня :) –

Смежные вопросы