사용자 지정 컬렉션 (스레드로부터 안전한 ObservableQueue)이 있습니다. 컬렉션 클래스 내에 비즈니스 로직을 구현했습니다. 즉, 항목을 하나씩 dequeue하여 외부에 노출합니다. 이것은 잘 작동합니다. 컬렉션이 초기화 된 스레드를 차단하지 못하도록 OnservableQueue는 해당 작업을 수행 할 스레드를 구현합니다. 이제는 발생할 수있는 함정에 대해 확신 할 수 없습니다.컬렉션에 포함 된 스레드 만들기 및 종료
생성자의 스레드를 초기화하는 것 (시작하지 말고 초기화 만하는 것)입니까? 스레드를 종료하는 것이 좋지 않더라도 최선의 방법은 무엇입니까? 참고, 스레드를 종료하는 방법을 알 필요가 없다, 그 일을 잘하고있다, 나는 오히려 일회용 패턴을 사용하거나 스레드를 종료하기 위해 호출해야하는 메서드를 만드는 일을 잘못 뭔가 날씨에 관심이 있습니다. IDisposable
을 구현하는 경우 수집/대기열과 관련하여 계정을 가져야하는 항목이 있습니까?
편집 : 스레드가 실제로에만 제대로 다시 initilised하는 인큐 방법에서 발생되는 NullReferenceException
을 방지하기 위해-초기화 사전된다 (인큐 방법은 큐 해제 스레드가 이미하고있는 경우 실행 날씨를 확인하도록되어 새로운 것을 시작하지 마라). 모든 항목이 대기열에서 제외되고 스레드가 작업을 완료 할 때마다 대기열이 비어 있고 새 항목이 추가 될 때마다 대기열을 처리하기 위해 새 스레드가 시작됩니다.
if (!_dequeuingThread.IsAlive)
{
// start the dequeuing thread
_dequeuingThread = new Thread(new ThreadStart(StartDequeuing));
_dequeuingThread.Name = "DeQueueThread";
_dequeuingThread.Start();
}
if 문에는 초기화 된 스레드가 필요합니다. 이를 달성 할 수있는 다른 방법이 있지만, 스레드를 미리 초기화하는 것이 가장 덜 불편한 것처럼 보였습니다. 날씨를 확인한 후에 스레드가 살아 있다는 것을 알 수 있습니다. 스레드가 사전 초기화되어 있으면 안되며 다시 제대로 초기화됩니다.
작업자 스레드가 대기열에서 항목을 반복하여 순환하는 좁은 루프에서 실행 중입니다. 그 루프에서 휘발성 bool의 진실 값을 확인합니다. 그리고 루프를 반복하거나 살아 있지 않습니다. 그럼 실제로 깃발을 어디에 놓았습니까? 메서드 ('StopDequeuing()') 또는'IDisposable'을 구현합니까? –
개인적으로 모두. 플래그를 설정하고 작업자 스레드가 종료 될 때까지 기다리는 StopDequeuing() 함수가 있고 StopDequeuing()을 호출 한 Dispose() 구현이 있습니다. – GazTheDestroyer