Есть ли способ остановить завершение работы приложения с работой еще в системе Threadpool - PullRequest
1 голос
/ 16 апреля 2009

Последний вопрос на сегодня :) спасибо за ваш вклад в предыдущие. КСТАТИ: уже обыскал форум по этому вопросу и ничего не отвечает на этот.

Мы используем некоторые сторонние библиотеки, которые работают с Threadpool, и мы не хотим завершать работу, пока есть выдающиеся действия.

При закрытии приложения оно будет закрыто, даже если в System.Threading.ThreadPool еще не завершена работа, поскольку эти потоки являются фоновыми потоками.

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

Я смотрел на использование GetAvailableThreads () против GetMaxThreads (), но они могут быть одинаковыми, потому что мы могли поймать Threadpool, когда поток был освобожден, но не выделен рабочий элемент в очереди.

Вся помощь оценена?

С уважением Noel

Ответы [ 4 ]

1 голос
/ 16 апреля 2009

Так как я настоящий программист (это C, парни ;-) Я не использовал ThreadPool.

Однако приходит на ум одно предложение: увеличивать семафор при выполнении каждой задачи в пуле потоков и выпускать этот семафор по завершении.

Когда ваше приложение выйдет, дождитесь семафора.

Любое использование?

1 голос
/ 16 апреля 2009

Если вы не можете получить какой-то обратный вызов в сторонний код (возможно, событие завершения), вы будете изо всех сил пытаться узнать, когда они перестали использовать ThreadPool. Сожалею. Такой код обычно должен быть в не фоновом потоке. Я понимаю, что вы не можете это контролировать - я просто не уверен, что из отверстия тоже есть легкий выход.

0 голосов
/ 21 апреля 2009

Спасибо за ваши ответы. Я нашел обходной путь за пределами пула потоков, используя AOP и динамический прокси Castle Windsors для внедрения подсчета ссылок во всем классе. К счастью для меня, класс продемонстрировал чистый интерфейс, который я мог бы обернуть, и он работает как удовольствие.

0 голосов
/ 16 апреля 2009

Я думаю, что Марк Гравелл прав. Хотя, если бы вы могли каким-то образом получить доступ к потокам, используемым в пуле потоков, вы могли бы изменить свойство Thread.IsBackground на false, чтобы достичь того, чего вы хотите. Но я не уверен, как вы получите ссылку на управляемый поток в пуле потоков.

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