C#에서 개발하는 동안이 문제를 여러 번 경험했습니다. 나는 행복하게, 함께 코딩 이리저리 스레드와 어떤 사이에 물체를 통과 할 것없는, 모든 나는이 익숙 오류 얻을 갑자기 :일부 개체가 다른 스레드에서 액세스 할 수없는 이유는 무엇입니까?
"The calling thread cannot access this object because a different thread owns it."
음, 좋아, 내가 전에 그것을 처리 한을, 특히 GUI 스레드에있는 객체의 경우 특정 문제를 해결하기 위해 몇 가지 추가 코드를 작성하면됩니다. 그러나 매번 나는 평범한 대상을 보았지만 다른 스레드가 액세스하는 것을 좋아하지 않습니다.
EDIT 액세스 예외를 일으키는 개체에 대한 원래 게시물에서 오인되었습니다. 그것은 IPAddress이 아니고 대신 IP 주소를 얻기 위해 사용했던 System.Printing.PrintQueue.입니다. 이것은 하나 이상의 스레드에서 평가할 수없는 개체입니다.
내가 작성한 모든 수업에는이 문제가 없습니다. 나 자신을 어떻게 구현할 지조차 모른다. 당신이 만든 스레드 ID로 멤버 변수를 유지하고 모든 단일 속성 및 메서드 액세스에 대해 현재 스레드를 확인해야합니까? 그게 미친 것 같아. 왜 마이크로 소프트는 ..... "OK ... PrintQueue, 확실히 스레드 사이에서 공유 할 수 없다고 결정할 것입니다.하지만이 다른 클래스는 ...."
왜 일부 개체는 여러 스레드 액세스가 차단 되었습니까?
대안에 대해 생각해보십시오. 모든 스레드는 원하는대로 모든 개체에 액세스 할 수 있습니다. 이제는 객체가 스레딩 문제를 적절히 처리하기 위해 접근 자에 의존해야하거나 여러 스레드의 접근 자에게 안전하도록 여러 가지 코드를 작성해야합니다. 옵션 1은 현실적이지 않고 옵션 2는 많은 작업입니다. 그래서 옵션 3 : 여러 스레드의 접근자를 허용하지 않기로 결정했습니다. – dlev
나쁜 마이크로 소프트. 나쁜. –
C# 가비지 처리는 사용 방법에 따라 특정 변수를 잠급니다. 필자는이 문제를 다루지 않았지만이 문제를 해결하는 좋은 방법은 스레드간에 공유 할 계획이라면 변수를 정적 소유자로 두는 것입니다. 하나의 스레드는 다른 스레드 쓰기를 읽습니다. 둘 다 값을 변경해야하는 경우 쓰기에 충돌이 없도록 잠금을 수행해야 할 수도 있습니다. –