System.Collections.Concurrent에는 다중 스레드 환경에서 잘 작동하는 몇 가지 새로운 컬렉션이 있습니다. 그러나 약간 제한적입니다. 항목이 사용 가능해질 때까지 차단되거나 default(T)
(TryXXX 메소드)을 반환합니다.비 블로킹 동시 수집?
스레드로부터 안전하지만, 호출 스레드를 차단하는 대신 콜백을 사용하여 하나 이상의 항목을 사용할 수 있음을 알리는 콜렉션이 필요합니다.
내 현재 솔루션은 BlockingCollection을 사용하지만 대리자와 함께 APM을 사용하여 다음 요소를 가져 오는 것입니다. 즉, 컬렉션에서 Take
s 인 메서드에 대한 대리자를 만들고 BeginInvoke
을 사용하여 해당 대리자를 실행합니다.
불행히도이 작업을 수행하기 위해 수업 시간에 많은 상태를 유지해야합니다. 더 나쁜 것은 클래스가 스레드로부터 안전하지 않다는 것입니다. 단일 스레드에서만 사용할 수 있습니다. 유지 보수성의 한계를 극복하고 있습니다.
제가 여기 꽤 간단한 작업을 수행하는 라이브러리가 있다는 것을 알고 있습니다 (Reactive Framework는 이것들 중 하나입니다). 그러나 버전 외의 참조를 추가하지 않고도 목표를 달성하고 싶습니다. 4 프레임 워크.
내 목표를 달성하는 외부 참조가 필요하지 않은 더 좋은 패턴이 있습니까?
TL; DR :
이 요구 사항을 만족 어떤 패턴이 있습니까 :
는 "나는 다음 요소에 대한 준비 컬렉션을 신호 할 필요가, 그리고 컬렉션이 실행이 그 다음 요소가 도착했을 때 어떤 스레드도 막히지 않고 콜백합니다. "
스레드로부터 안전할까요? 델리게이트가 호출되기 전에 사용할 수있는 항목을 사용할 수 없게되는 것을 멈추게하는 것은 무엇입니까? 그리고 전반적인 목표 (즉, 큐잉 시스템)는 무엇입니까? –
@ Adam 아이템을 소비 할 때의 좋은 점. 대리자는 컬렉션에서 제거 된 항목을 가져옵니다. 그래서 델리게이트의 실행은 아이템이 컬렉션에서'Take'-en이 될 때까지 차단되고 그 아이템은 EndInvoke에 전달 된'객체'입니다. 전반적인 목표는 다소 복잡합니다. 본질적으로 항목을 사용할 수있게 될 때까지 워크 플로를 유휴 상태로 유지해야합니다. 워크 플로우의 실행을 차단할 수 없으므로 항목을 단순히 가져 오면 호출 블록처럼 작동하지 않습니다. 북마크를 만든 다음 확장 프로그램에 전달해야합니다. Extension은 Delegate를 호출 해, 콜백 내의 북마크를 재개합니다. – Will
불행히도 저는 워크 플로우에 대한 경험이 거의 없습니다. 질문에 세부 사항을 추가하면 누군가의 관심을 끌 수 있습니다. :-) –