Можно ли группировать / изолировать задачи в ThreadPool при использовании WaitHandle.WaitAll? - PullRequest
2 голосов
/ 24 февраля 2010

Сценарий, с которым я сталкиваюсь, как показано ниже. Поскольку ThreadPool - это 1 экземпляр на процесс, поэтому мой вопрос заключается в том, что будет метод 1 отменять задачи, поставленные в очередь методом 2 через 3 секунды ?

http-запрос приходит

*method 1 gets executed first*:

  ThreadPool.QueueUserWorkItem x 3
  WaitHandle.WaitAll for 3 seconds

*method 2 gets executed after method 1*:

  ThreadPool.QueueUserWorkItem x 10
  WaitHandle.WaitAll for 10 seconds

Извините, я думаю, что совершенно неправильно понял использование WaitHandle. Кажется, что если я сделаю ниже, все будет работать, как хотелось бы. Извините за путаницу.

var calls = new ManualResetEvent[5];
//ThreadPool.QueueUserWorkItem blah...
WaitHandle.WaitAll(calls, timeOut);

Но я все еще думаю, что произойдет, когда метод 1 заполнит пул потоков долго выполняющимися задачами, а метод 2 ждет только 1 секунду. Будет ли метод 2 когда-нибудь возвращать свои результаты, потому что он не ждет достаточно долго.

Спасибо.

Ответы [ 4 ]

1 голос
/ 25 февраля 2010

По поводу вашего обновления:

Имейте в виду, что если вы используете WaitAll с приложением Windows Forms, оно не будет работать без установки точки входа на [MTAThread] (что компилятор все равно не работает)

Этот расширенный ThreadPool поддерживает группирование рабочих элементов (и их отмену), что может помочь, если вы все еще ищете решение.

1 голос
/ 24 февраля 2010

Я думаю, вам следует создать собственную очередь + диспетчер для обработки группой ваших действий или задач. Шаблон Active Object - хороший выбор. Вы можете контролировать приоритет выполнения действий, можете написать правило ожидания некоторых действий в группе (с помощью метода Guard), ожидания «любых» или «всех» результатов. Вы можете прочитать эту статью , в ней есть код, чтобы попробовать этот шаблон в действии.

Удача!

1 голос
/ 24 февраля 2010

Как уже отмечали другие люди, когда ожидание завершится, method 1 не отменит потоки, поставленные в очередь на method 2 , если у вас не будет явного кода в method 1, который конкретно вызывает method 2 отменить .

Вы упомянули, что у вас может быть состояние гонки, но если method 2 не полагается на method 1 для выполнения некоторых вычислений с результатами в method 1, то в вашем примере нет явного состояния гонки. .

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

1 голос
/ 24 февраля 2010

Нет, это не отменяет задачи. Просто вы бы предпочли перестать ждать. Кстати, не будет ли выброшено исключение тайм-аута, когда WaitAll превышает timeout?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...