2010-02-23 2 views
2

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

запрос 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 получать результаты обратно, потому что он не ждет достаточно долго.

Спасибо.

+0

Я не вижу, где у вас будет состояние гонки здесь ... это метод 2, используя данные из метода 1? Существует ли явное взаимодействие между этими двумя методами? – Kiril

ответ

1

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

+0

Я немного смущен Так вы хотите запустить Method1 параллельно 3 раза, а затем Method2 параллельно 10 раз?Или метод 1 запускает 3 задачи, а затем Method2 запускает 10 задач? Если это так, код выглядит так: {Method1(); WaitAll(); Method2();} и yes, Method2 ждет Method1. – user76035

1

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

Удача!

+0

Кажется, что это может занять некоторое время, чтобы понять это. – Jeff

1

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

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

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

1

Ссылаясь на Ваше обновление:

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

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

+0

@ Крис, спасибо, и я посмотрю. Но я думал, согласно http://msdn.microsoft.com/en-us/library/aa332365(VS.71).aspx «Нить не может быть отменена немедленно или вообще». – Jeff

+0

@Chirs, в терминах проблемы [MTAThread], будет WaitAll работать при использовании WCF? – Jeff

+1

@Jeffrey WCF не должен быть проблемой, если вы используете службу (по умолчанию это MTA), если WCF не делает что-то, о чем я не знаю, с помощью насосов winapi и сообщений. Для проблемы прерывания потока: «* Эта ситуация может возникнуть, если поток выполняет неограниченное количество вычислений в блоках finally, которые называются частью процедуры прерывания *» - вы это вообще делаете? WaitAll и WaitHandles, являющиеся Mutexes, будут бросать «AbandonedMutexException» –

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