2011-03-11 2 views
0

개체의 인스턴스에서 작동하는 WCF 호스트를 설치했습니다. WCF 클라이언트에서 다음 메서드를 호출하면 "다른 스레드가이 스레드를 소유하고 있기 때문에 호출 한 스레드는이 개체에 액세스 할 수 없습니다."라는 오류가 발생합니다.다른 스레드가 스레드를 소유하고 있기 때문에 호출 스레드가이 개체에 액세스 할 수 없습니다.

public List<PrintQueueData> getPrintQueues() 
{ 
    List<PrintQueueData> resultQueues = new List<PrintQueueData>(); 

    List<PrintQueue> queues = queueCollection; 

    foreach (PrintQueue q in queues) 
    { 
     // This throws an exception 
     resultQueues.Add(new PrintQueueData(q.HostingPrintServer.ToString(), q.Name)); 

     // This does NOT throw any exceptions 
     resultQueues.Add(new PrintQueueData("1", "2"); 
    } 

    return resultQueues; 
} 

이 오류를 해결하려면 어떻게해야합니까?

EDIT : queueCollection은이 메서드가 포함 된 클래스의 필드입니다.

EDIT : queueCollection은이 클래스의 시작 부분에서 선언되며 형식은이 메서드에서 할당 된 것과 같은 인쇄 큐 목록입니다.

편집 : 나는 timerCollection을 사용하는 타이머를 실행했지만 Timer.Enabled를 false로 설정하고 오류가 여전히 발생했습니다.

+0

"queueCollection"의 출처는 어디입니까? –

+0

BackgroundWorker 또는 Thread를 어딘가에 사용하고 있습니까? –

+0

그러나 queueCollection을 사용하는 타이머를 실행했지만 Timer.Enabled를 false로 설정 한 후에도 오류가 발생했습니다. – mike9182

답변

0

List<PrintQueue> queues = queueCollection.ToList(); 또는 그 라인을 따라 뭔가를 시도해 볼 수 있습니다. 당신이 달성하고자하는 일은 신속하게 queueCollection의 복사본을 생성하는 것입니다. 이렇게하면 큐가 다른 스레드에 의해 '잠겨'있어 상기 오류를 유발할 가능성을 줄여야합니다.

또는 queueCollection에 액세스 할 때 동기화를 시도 할 수 있습니다. 예를 들면 : wantMyQueue는 단순히 object 전역 변수입니다

lock (wantMyQueue) 
{ 
    // Access queueCollection in here 
} 

.

+0

감사하지만 두 가지 제안이 모두 작동하지 않았습니다. – mike9182

+1

어쨌든 어떤 데이터 타입이'queueCollection'입니까? –

+0

+1 - queueCollection은 어떤 유형입니까? 선언 된 곳은 어디입니까? 스레드 또는 배경 작업자를 만들고 있습니까? –

1

"PrintQueue"유형은 "DependencyObject"와 유사하게 동작합니다. WPF의 UI 요소와 비슷한 현재 스레드의 "Dispatcher"에 바인딩됩니다. 그건 당신이 대기열을 만든 스레드와 다른 스레드에서 사용할 수없는 방법입니다. "PrintQueue"개체 대신 "PrintQueueData"개체를 캐싱하거나 각 메서드 호출에 "PrintQueue"인스턴스를 만들어야합니다.

실제 예외는 "System.Printing.PrintQueue.VerifyAccess()"에 의해 호출되는 "System.Windows.Threading.Dispatcher.VerifyAccess()"에서 가져옵니다. 후자는 인쇄 대기열의 속성이나 메소드에 액세스 할 때마다 호출됩니다.

관련 문제