Pergunta

Eu tenho um código para iniciar um thread no .NET CF 2.0:

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

Se eu chamar isso dentro de um loop, os itens estarão completamente fora de ordem.Como introduzir uma espera depois t.Start(), para que o trabalho no thread seja concluído antes que o código continue?BeginInvoke/EndInvoke será uma opção melhor para isso do que criar threads manualmente?

Foi útil?

Solução

Quanta ordem você precisa impor aos fios?Se você só precisa que todo o trabalho iniciado no loop termine antes que o código continue, mas não se importa com a ordem em que o trabalho dentro do loop termina, chamar Join é a resposta.Para adicionar mais detalhes A resposta de Kevin Kenny, você deveria ligar para Join fora o laço.Isso significa que você precisará de uma coleção para conter referências aos threads que você iniciou:

// 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();
}

Por outro lado, se você chamasse Join dentro do loop, o resultado seria basicamente o mesmo que não usar threads.Cada iteração do corpo do loop criaria e iniciaria um thread, mas imediatamente se juntaria a ele e esperaria que ele terminasse.

Se os threads individuais produzirem algum resultado (escrever uma mensagem em um log, por exemplo), então as mensagens ainda poderão aparecer fora de ordem porque não há coordenação entre os threads.É possível fazer com que os threads produzam seus resultados em ordem, coordenando-os com um Monitor.

Outras dicas

Outra maneira de esperar que um thread termine é usar um AutoResetEvent.

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

Se estou lendo isso corretamente, você está iniciando itens de trabalho em vários threads, mas está preocupado com o fato de os threads estarem sendo concluídos fora de ordem e prefere esperar até que cada thread seja concluído na ordem em que foram iniciados.

Se for esse o caso, não sei por que você está criando um thread por item de trabalho.Talvez você possa expandir?

Se você precisasse esperar a conclusão de um tópico, basta fazer:

t.Join();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top