В System.Collections.Concurrent есть несколько новых коллекций, которые очень хорошо работают в многопоточных средах. Однако они немного ограничены. Либо они блокируются, пока элемент не станет доступным, либо возвращают default(T)
(методы TryXXX).
Мне нужна коллекция, которая является потокобезопасной, но вместо блокировки вызывающего потока она использует обратный вызов, чтобы сообщить мне, что доступен хотя бы один элемент.
Мое текущее решение — использовать BlockingCollection, но использовать APM с делегатом для получения следующего элемента. Другими словами, я создаю делегат для метода, который Take
s из коллекции, и выполняю этот делегат, используя BeginInvoke
.
К сожалению, для этого мне нужно сохранить много состояний в моем классе. Хуже того, класс не является потокобезопасным; он может использоваться только одним потоком. Я обхожу грань ремонтопригодности, чего я бы предпочел не делать.
Я знаю, что есть некоторые библиотеки, которые делают то, что я здесь делаю, довольно простым (я считаю, что Reactive Framework является одной из них), но я хотел бы достичь своих целей, не добавляя никаких ссылок за пределами версии 4 фреймворка. .
Есть ли какие-нибудь лучшие шаблоны, которые я могу использовать, которые не требуют внешних ссылок для достижения моей цели?
tl;dr:
Существуют ли шаблоны, удовлетворяющие требованию:
"Мне нужно сообщить коллекции, что я готов к следующему элементу, и заставить коллекцию выполнить обратный вызов, когда этот следующий элемент прибудет, без блокировки каких-либо потоков."
Take
-en из коллекции, и этот элемент не будетobject
передан EndInvoke. Общая цель немного запутана; по сути, я должен простаивать рабочий процесс, пока элемент не станет доступным. Вы не можете заблокировать выполнение рабочего процесса, поэтому простоTake
-элемент не будет работать, поскольку вызов блокирует. Мне нужно создать закладку, а затем передать ее расширению. Расширение вызывает делегат, возобновляя закладку в обратном вызове. - person   schedule 19.07.2010