>

차단 모음 에서 Take() 를 발견했습니다.  그리고 TryTake()  또한 Add()  그리고 TryAdd()

수취 할 품목이 없으면 Take()   Add() 와 마찬가지로 항목이 추가 될 때까지 기다립니다.  컬렉션이 최대 한도에 도달하면 항목이 제거 될 때까지 기다립니다.

병렬 프로그래밍에 관한 조 셰프 알바 리의 기사

"Add and TryAdd may block if the collection size is bounded; Take and TryTake block while the collection is empty."

그래서 Take()  그리고 TryTake()  둘 다 항목이 추가 될 때까지 기다립니다. 따라서 타임 아웃 또는 취소 토큰을 제공하지 않으면 Take() 의 차이점은 무엇입니까?  그리고 TryTake() , TryTake() 해서는 안됩니다   return false  곧장 기다리지 않습니까? TryAdd() 와 동일  ?

  • 답변 # 1

    TryTake  기다리지 않으면바로 false 를 반환합니다.  컬렉션에 아무것도없는 경우 와이즈 비즈  항목을 기다립니다.

    TryTake :

    와이즈 비즈

    취하기 :

    와이즈 비즈

  • 답변 # 2

    Take  

    If the collection is empty, this method immediately returns false.

    를 던져 대기열 완료를 알립니다. . 예외 탭이 잡힌 예외를 처리하도록 구성된 경우 디버깅이 약간 어려워집니다.

    이 때문에

    A call to Take may block until an item is available to be removed.

    를 사용하려고했습니다. . 그 Take 로 밝혀졌습니다  실제로 InvalidOperationException 를 사용합니다 시간 제한이 무한대입니다. 그래서 이것을 쓰는 대신 :

    TryTake
    
    

    BlockingCollection<T>.Take 를 사용할 수 있습니다  다음과 같이 :

    TryTake
    
    

    코드를 훨씬 더 깨끗하게 만들고 while (!queue.IsCompleted) { object obj; try { obj = queue.Take(); } catch (InvalidOperationException) { continue; } // Do something with obj. } 를 던지지 않습니다 .

    TryTake

관련 자료

  • 이전 loops - 평균값 스칼라 증가
  • 다음 linux - 디렉토리에 특정 확장자를 가진 파일을 인쇄하는 방법은 무엇입니까?