Вызывающий поток не может получить доступ к этому объекту, потому что другой поток владеет им [дубликат]

20
задан abatishchev 24 February 2012 в 22:06
поделиться

3 ответа

Вы можете просмотреть эти классы в отражателе. Исключение возникнет в cb.Freeze (). В

CroppedBitmap cb = new CroppedBitmap(bf, new Int32Rect(1,1,5,5));

конструктор case делал что-то вроде этого:

this.this.Source = source;

Итак, источник не был создан в текущем потоке, поэтому возникнет исключение. В случае

new WriteableBitmap(bf)

конструктор синхронизируется с объектом bf, а новый источник - созданы в текущем потоке, поэтому исключения не возникнут. Если вас интересуют подробные сведения, вы всегда можете отразить базовые библиотеки с помощью Reflector :)

3
ответ дан 30 November 2019 в 00:43
поделиться

При работе с WPF имейте в виду, что если вы создаете объект пользовательского интерфейса в одном потоке, вы не сможете получить к нему доступ из другого потока. Ваши объекты пользовательского интерфейса должны (обычно) быть созданы потоком пользовательского интерфейса, а затем вам понадобится поток пользовательского интерфейса для доступа к ним позже. Никакой другой поток не сможет получить доступ к объектам, созданным в потоке пользовательского интерфейса.

Если вам нужно получить доступ к объекту пользовательского интерфейса из другого потока, вам понадобится поток пользовательского интерфейса Dispatcher , а затем вы можете использовать его для вызова вызовов в потоке пользовательского интерфейса.

Я провел много часов, разочаровавшись в подобных проблемах - поверьте мне .. Посмотрите этот вопрос - он дал мне много полезной информации по этому поводу.

7
ответ дан 30 November 2019 в 00:43
поделиться

Следующий код может помочь вам решить проблему обновления элемента gui из другого потока :

Уровень модуля

delegate void updateCallback(string tekst);

Вот метод обновления элемента :

private void UpdateElement(string tekst)
{
    if (element.Dispatcher.CheckAccess() == false)
    {
        updateCallback uCallBack = new updateCallback(UpdateElement);
        this.Dispatcher.Invoke(uCallBack, tekst);
    }
    else
    { 
//update your element here
    }
 }
16
ответ дан 30 November 2019 в 00:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: