2016-04-29 2 views
0

У меня есть многопоточные приложения, и я хочу, чтобы иметь возможность использовать таймер, чтобы периодически проверять, чтобы увидеть, если все потоки закончили перед началом нового, а именно:Периодически проверяйте, чтобы увидеть, если все потоки завершили

var checkStatusTimer = new System.Threading.Timer(new TimerCallback(CheckThreads), null, 10000, 10000); 

Это насколько я уже пришел. Что нужно будет найти в методе CheckThreads, чтобы проверить, выполнены ли они? Я думал о чем-то вроде функции, которая их проверяет:

   foreach (Thread thread in Threads) 
      { 
       Thread t = thread; 
       if (t.ThreadState != ThreadState.Stopped) 
        return false; 
      } 

Есть ли я на правильном пути? это правильный способ сделать это? Или я должен использовать System.Timers.Timer вместо этого? Кроме того, форма функции внутри Я хочу сделать эту периодическую проверку статичной. Любая помощь будет оценена по достоинству.

+0

Предлагаю вам добавить тег [tag: C#] или что-то еще. – nwp

ответ

1

Используйте Task вместо Thread. Затем, вы можете создать комбинированную задачу:

Task[] tasks = ...; //You provide this 
Task combined = Task.WhenAll(tasks); 

Теперь вы можете проверить для завершения: combined.IsCompleted. Вы можете также Wait и await этой задачей.

Thread - это устаревший API, который редко рекомендуется использовать.

+0

Приложение работает в .NET 3.5, который, я считаю, не поддерживает Tasks. – user609926

+0

@ user609926 Используйте этот пакет nuget, чтобы ввести задачу в .net 3.5: https://www.nuget.org/packages/TaskParallelLibrary/ – Maarten

0

Подход, основанный на задачах @ usr, является лучшим, но если вы должны полагаться на потоки, то я предлагаю, что по мере завершения каждого потока он вызывает метод, который удаляет поток из вашей коллекции Threads. Тогда все, что вам нужно сделать в обратном вызове по таймеру, - проверить счетчик коллекции. Опираясь на ThreadState is not advisable.

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