Как я могу сделать асинхронные обратные вызовы обрабатываться в другом пуле потоков? - PullRequest
2 голосов
/ 01 февраля 2010

При выполнении асинхронного вызова begin ... передаваемый мной делегат обрабатывается (согласно документации) в пуле потоков по умолчанию.

, например: System.IO.Stream.BeginRead (byte []буфер, смещение int, число int, обратный вызов AsyncCallback, состояние объекта);

Как я могу сделать так, чтобы я мог использовать выделенный пул потоков для обработки асинхронных методов?должно быть сделано, так как CCR (Concurrency Coordination Runtime) также делает это (согласно их документации))

1 Ответ

2 голосов
/ 01 февраля 2010

Строго говоря, он обрабатывается в части ввода-вывода пула потоков (асинхронные операции ввода-вывода имеют собственный набор потоков, отличный от тех, которые используются методами ThreadPool.Queue*).

Единственный способ сделать это в настоящее время (с выпущенными / поддерживаемыми инструментами) - передать метод-заглушку в BeginRead, который перенаправляет выполнение в ваш собственный пул потоков:

var async = stream.BeginRead(buffer, offset, count,
                            ayn => { MyThreadPool.Dispatch(() => {
                              // Handle completion
                            }}, null);

Расширения Reactive Framework (RX) облегчили бы эту задачу: создайте реализацию IScheduler для вашего пула потоков, но RX является CTP и, скорее всего, пройдет некоторое время, прежде чем любая форма будет запущена.

...