2010-09-13 6 views
12

차단 우선 순위 큐를 만들어야하는데 TakeFromAny가 비밀 요소 일 수 있습니다.하지만 그 메서드에 대한 설명서는 희소합니다. 그 목적/적절한 용도는 무엇입니까/BlockingCollection.TakeFromAny 메서드가 유용한 이유는 무엇입니까?

내 요구 사항은 다중 스레드가 높은 우선 순위 또는 낮은 우선 순위 큐에 추가된다는 것입니다. 하나의 스레드는 항상 낮은 우선 순위 큐 앞에 높은 우선 순위 큐에서 가져 오는이 두 큐를 소비합니다.

BlockingCollection 또는 TakeFromAny 메소드가 전혀 유용하지 않을 수도 있습니다. 그렇다면, 올바른 방향의 포인터가 인정 될 것입니다.

답변

11

당신 말이 맞습니다. 설명서는 다소 드문 경우입니다. 그러나 Reflector를 통해 구현을 살펴본 결과 BlockingCollection.TakeFromAny 메서드를 사용하여 원하는 우선 순위 바이어스를 시뮬레이션 할 수 있다고 생각합니다. 이유는 구현 된 모든 신호 객체의 최소 인덱스를 반환하는 WaitHandle.WaitAny 메소드를 사용하기 때문입니다. 즉, 항목이있는 대기열이 두 개 이상있는 경우 배열에 처음 나타나는 대기열이 항상 선택됩니다.

다음 코드는 항상 "높음"을 출력해야합니다.

var low = new BlockingCollection<object> { "low" }; 
var high = new BlockingCollection<object> { "high" }; 
var array = new BlockingCollection<object>[] { high, low }; 
object item; 
int index = BlockingCollection<object>.TakeFromAny(array, out item); 
Console.WriteLine(item); 
+1

감사합니다.이 매우시기 적절한 응답으로 brian에게 감사드립니다. 당신의 대답은 제가 관찰 한 것과 일치합니다. 이제는이 동작이 문서화되지 않았기 때문에 한 버전에서 다음 버전으로 변경되지 않는다는 신뢰를 사용하여 얼마나 많은 위험을 감수하고 있습니까? –

+1

@ 랄프 : 귀하의 우려를 이해합니다. 나는 이것이 마이크로 소프트가 수행 한 정확한 행동이라는 의심을 품고 나의 직감은 항상 이런 식으로 행동 할 것이라는 점이다. 확인을 위해 문서에 중요한 정보를 추가하는 것이 좋을지도 모릅니다. –

+1

MS가 수행 한 동작 인 경우 'TakeFromFirstAvailable'이라고하지 않겠습니까? – Gabe

관련 문제