Вызывающий поток не может получить доступ к этому объекту, потому что другой поток владеет им - PullRequest
0 голосов
/ 11 марта 2011

Я настроил хост 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 объявляется в начале этого класса, а его тип представляет собой список очереди печати, такой же, какему присваивается этот метод.

РЕДАКТИРОВАТЬ: у меня был запущен таймер, который использовал queueCollection, однако я установил для Timer.Enabled значение false, и ошибка все еще произошла.

Ответы [ 2 ]

1 голос
/ 13 апреля 2011

Тип "PrintQueue" ведет себя как "DependencyObject". Он привязан к «Диспетчеру» текущего потока, аналогично элементам пользовательского интерфейса в WPF. Таким образом, вы не можете использовать его в потоке, отличном от потока, создавшего очередь. Вы должны либо кэшировать свои объекты «PrintQueueData» (вместо своих объектов «PrintQueue»), либо создавать экземпляры «PrintQueue» при каждом вызове метода.

Фактическое исключение, которое вы получаете, происходит от "System.Windows.Threading.Dispatcher.VerifyAccess ()", который вызывается "System.Printing.PrintQueue.VerifyAccess ()". Последний вызывается всякий раз, когда вы обращаетесь к свойству или методу очереди печати. ​​

0 голосов
/ 11 марта 2011

вы можете попробовать List<PrintQueue> queues = queueCollection.ToList(); или что-то в этом роде.Вы хотите быстро создать копию queueCollection.Это должно снизить вероятность того, что очередь будет «заблокирована» каким-либо другим потоком и, следовательно, приведет к указанной ошибке.

альтернативно, вы можете попытаться использовать синхронизацию при доступе к queueCollection.Например:

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

, где wantMyQueue - это просто object глобальная переменная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...