Pergunta

eu tenho um listoddata e uma lista de rosca no segmento principal .i estou passando cada dado elemento de lista para thread.want correspondente a thread principal para esperar o untill de fio são executados.

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

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

mas após a primeira iteração deste laço da linha principal não será executed.and se qualquer segmento 0 é concluída bloco .code será executado. que eu não quero.

Foi útil?

Solução

Esta é uma maneira perfeitamente válida para join em vários segmentos. Se você esperar em todos os segmentos, mesmo sequencialmente, ele vai ficar bem. Ele não terá que esperar por fios que já estão completos. Se um segmento ainda está em execução, ele irá esperar até que esse segmento está completa.

Outras dicas

Sahil, o que você está tentando alcançar, certificando-se que se juntam em todos os tópicos são chamados sem ter que esperar para cada um deles para executar? Se a sua para o desempenho, isso não vai ajudar muito, já que de qualquer maneira mesmo se você estiver chamando um Thread.Join em todos os tópicos, tem que esperar para cada um dos fios ao fim antes de prosseguir em frente.

De qualquer forma, se for preciso, então aqui está o que eu tenho que dizer:

Não há nenhum método direto de espera em todos os segmentos em um stmt. Em vez disso depois de algum R & D eu vim com um método indireto pouco. Em vez de inicializar um fio e passar um ParameterizedThreadDelegate a ele, você pode fazer directamente um BeginInvoke na ParameterizedThreadDelegate. E então você pode usar WaitHandle.WaitAll que esperar para todos os delegados para concluir a execução antes de prosseguir em frente.

Aqui está o código:

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);

    }
} 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top