Вы можете просмотреть эти классы в отражателе. Исключение возникнет в cb.Freeze (). В
CroppedBitmap cb = new CroppedBitmap(bf, new Int32Rect(1,1,5,5));
конструктор case делал что-то вроде этого:
this.this.Source = source;
Итак, источник не был создан в текущем потоке, поэтому возникнет исключение. В случае
new WriteableBitmap(bf)
конструктор синхронизируется с объектом bf, а новый источник - созданы в текущем потоке, поэтому исключения не возникнут. Если вас интересуют подробные сведения, вы всегда можете отразить базовые библиотеки с помощью Reflector :)
При работе с WPF имейте в виду, что если вы создаете объект пользовательского интерфейса в одном потоке, вы не сможете получить к нему доступ из другого потока. Ваши объекты пользовательского интерфейса должны (обычно) быть созданы потоком пользовательского интерфейса, а затем вам понадобится поток пользовательского интерфейса для доступа к ним позже. Никакой другой поток не сможет получить доступ к объектам, созданным в потоке пользовательского интерфейса.
Если вам нужно получить доступ к объекту пользовательского интерфейса из другого потока, вам понадобится поток пользовательского интерфейса Dispatcher , а затем вы можете использовать его для вызова вызовов в потоке пользовательского интерфейса.
Я провел много часов, разочаровавшись в подобных проблемах - поверьте мне .. Посмотрите этот вопрос - он дал мне много полезной информации по этому поводу.
Следующий код может помочь вам решить проблему обновления элемента 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
}
}