Pergunta

Eu tenho um thread que está chamando dois threads separados para fazer algum trabalho.Sempre que qualquer um dos trabalhos é concluído, um Waithandle.Set(0 é chamado e no final do thread de trabalho pai eu queria WaitAll para que ambos fossem concluídos, antes de continuar.Mas priceA() ainda vem primeiro e depois PriceB().

new Thread(() =>
                           {
                               new Thread(() =>
                               {
                                   PriceA = _service.GetPriceA();
                                   _waithandle[0].Set();
                               }).Start();

                               new Thread(() =>
                               {
                                   PriceB = _service.GetPriceB();
                                   _waithandle[1].Set();
                               }).Start();

                               WaitHandle.WaitAll(_waithandle);
                           }).Start();
Console.WriteLine("Hello");

o que estou perdendo?

Atualizar:

private EventWaitHandle[] _waithandle;

Diretor:

 _waithandle[0] = new ManualResetEvent(false);
 _waithandle[1] = new ManualResetEvent(false);
Foi útil?

Solução 2

new Thread(() =>
                           {
                               new Thread(() =>
                               {
                                   _priceA = _service.GetPriceA();
                                   _waithandle[0].Set();
                               }).Start();

                               new Thread(() =>
                               {
                                   _priceB = _service.GetPriceB();
                                   _waithandle[1].Set();
                               }).Start();

                               WaitHandle.WaitAll(_waithandle);
                               PriceA = _priceA;
                               PriceB = _priceB;
                           }).Start();

Isso fez o trabalho para mim.O culpado foi INotifyChangedProperty() de PriceA e PriceB, que atualizou a IU muito cedo, tornando meu waitall redundante.Caso alguém tenha um problema semelhante...

Outras dicas

Você está criando um tópico separado esperar...mas o código após a declaração que você forneceu continuará porque você não está esperando que fio.Em outras palavras, você está criando três threads:

  • Tópico X:Cria os threads A e B e espera que eles terminem
  • Tópico A:Obtém PriceA e depois define waitHandle[0]
  • Tópico B:Obtém PriceB e depois define waitHandle[1]

Mas o thread X não está fazendo nada depois é esperado, então qual é o sentido de esperar dentro dele?

Além disso, seria muito mais simples simplesmente ligar Join nos tópicos extras que você criou.Na verdade, se você só precisa esperar no thread "atual", você só precisa um tópico extra em primeiro lugar:

Thread t = new Thread(() => { PriceA = _service.GetPriceA(); });
t.Start();
PriceB = _service.GetPriceB();
t.Join();
// Other code

Quando você chegar a "outro código", tanto PriceA quanto PriceB terão sido definidos.Claro, falta uma quantidade considerável de tratamento de erros ...mas isso é mais fácil de adicionar quando você tem um ponto de partida mais simples do que o seu código atualmente muito complicado.

Você está redefinindo corretamente o _waithandle[0] e [1]?Por exemplo:

_waithandle[0] = new ManualResetEvent(false);
_waithandle[1] = new ManualResetEvent(false);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top