서로 다른 쓰레드가 간섭 날 때 Task를 막거나 지연 시키는 방법이 궁금합니다.

서로 다른 쓰레드에서 IEnumerable<Request>Task막거나 둘 중 하나를 지연 시키는 방법이 궁금합니다.

// Error
Collection was modified; enumeration operation may not execute.

// Request 생성 … In post API
IEnumerable<Request> CreateRequest()

Post API를 (비동기) 요청 할 때 발생하는 에러입니다.
서로 다른 작업이 IEnumerable<Request>을 가져올 때 생기는 문제 인 것 같습니다.
image
image
(이런 상황이 아닌가 추측 중입니다. A와 B가 섞이니 A,B 둘다 아닌 비빔밥이 나오는 느낌…)


후 … 테스트 코드에서 에러가 발생하는 상황입니다.
테스트 코드를 개별로 빌드하면 에러가 발생하지 않습니다.
=> 테스트 코드 전체를 빌드하면 간헐적으로 발생하고 있습니다.
큰 문제는 안되는데… 문제는 자동화(Pipeline)에서 재빌드(실패할 때마다) 해야하는 귀찮음이…

1개의 좋아요

목록을 생성하는 코드 부분이 있어야 정확한 답이 가능할 것 같습니다.

2개의 좋아요

저도 정확한 코드는 모르지만 해당 오류는 IEnumerable는 일반적으로 Collection이 변조될 때 발생하는 것 같습니다. 예를 들면 foreach를 돌리고 있는데 다른 스레드에서 이를 추가, 삭제 시킨다던가 할 때요. 하나의 IEnumerable를 동시에 여러 곳에서 사용한다면 ToList나 다른 형태로 복제시켜서 사용하면 위 오류는 발생하지 않을 것 같습니다.

4개의 좋아요

열거자는 컬렉션에 단독으로 액세스할 수 없으므로 컬렉션이 변경되지 않는 한 열거자는 유효한 상태로 유지됩니다. 요소 추가, 수정 또는 삭제와 같이 컬렉션을 변경하면 열거자가 무효화되고 예기치 않은 결과가 발생할 수 있습니다. 또한 컬렉션을 열거하는 것은 스레드로부터 안전한 프로시저가 아닙니다. 스레드 안전성을 보장하려면 열거자 중에 컬렉션을 잠그거나 컬렉션에 대한 동기화를 구현해야 합니다.
Thread-safe enumeration in C# - CodeProject

5개의 좋아요

질문의 제목으로 돌아가서,

서로 다른 스레드가 간섭 날 때 → 서로 간섭하지 않도록 자원을 분리. 문제의 본질은 목록이 조회되는 시점에서 목록이 변경되어 생기는 문제로 그 부분이 해결되면 될 듯 합니다.
Task를 막거나 지연 시키는 방법 → Task를 막거나 지연 시키지 않아도 되게 만드는 것이 좋습니다.

좀 더 필요한 답은 목록 생성 코드를 공유 주셔야 가능할 듯 해요.

4개의 좋아요