asp.net: вызывать метод join для нескольких объектов потока? - PullRequest
0 голосов
/ 17 мая 2009

У меня есть список данных и список потоков в основном потоке. Я передаю данные каждого элемента списка в соответствующий поток. Хочу в основной поток ждать, пока не будут выполнены все потоки.

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

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

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

Ответы [ 2 ]

3 голосов
/ 17 мая 2009

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

1 голос
/ 17 мая 2009

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

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

Не существует прямого метода ожидания для всех потоков в одном stmt. Вместо этого после некоторого исследования я разработал небольшой косвенный метод. Вместо инициализации потока и передачи ему 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);

    }
} 
...