Если ThreadPool заполнен, как сделать Action.BeginInvoke порождающим поток, не являющийся пулом потоков - PullRequest
1 голос
/ 24 февраля 2009

In .net 3,5

попытка ThreadPool.QueueUserWorkItem(a=> {Work()});, когда ThreadPool не имеет доступных потоков, вызвало блокировку BeginInvoke.

void Work()
{
   Action executor = () = { DoSomething(); };
   IAsyncResult result = executor.BeginInvoke(null, null);

   using (WaitHandle hWait = result.AsyncWaitHandle)
   {
      if (hWait.WaitOne(timeoutMilliseconds))
      {
        executor.EndInvoke(result);
      }
      else
      {  throw new ImDyingException(); }
   }
}

Как я могу заставить BeginInvoke использовать поток без пула?

1 Ответ

5 голосов
/ 24 февраля 2009

Вы не можете. Похоже, вы чрезмерно используете бассейн. Возможно, рассмотрите дросселированную очередь / пул пользовательских потоков (то есть синхронизированную очередь производителя / потребителя)?

(не увеличивайте размер пула; это почти всегда неправильный подход)

...