Как скопировать DispatcherObject (BitmapSource) в другой поток?

Я пытаюсь выяснить, как я могу скопировать DispatcherObject (в моем случае BitmapSource) в другой поток.

Вариант использования:
У меня есть приложение WPF, для которого нужно к витрине в новом потоке (приложение является на самом деле дополнением Outlook, и мы должны сделать это, потому что Outlook имеет некоторые рычаги в основном потоке UI и крадет определенные горячие клавиши, которые мы должны использовать - 'потерянный в переводе' в interop Outlook, WPF (который мы используем для UI), и Winforms (мы должны использовать определенные обеспеченные Microsoft средства управления winforms)).

С этим у меня есть своя реализация WPFMessageBox, который настроен путем установки некоторых статических свойств - и и одним из них является BitmapSource для значка. Это используется так, чтобы в запуске я мог установить WPFMessageBox. Значок однажды, и с тех пор, каждый WPFMessageBox будет иметь тот же значок.

Проблема состоит в том, что BitmapSource, который присвоен в значок, является DispatcherObject, и, когда считано, он бросит InvalidOperationException: "Вызывающий поток не может получить доступ к этому объекту, потому что другой поток владеет им"..

Как я могу клонировать тот BitmapSource в фактический поток? Это имеет Клон () и CloneCurrentValue () методы, которые не работают (они выдают то же исключение также). Мне также пришло в голову использовать originalIcon. Диспетчер. Вызовите (сделайте клонирование здесь) - но Диспетчер BitmapSource является пустым, и все еще - я создал бы копию на неправильном потоке и все еще не мог использовать его на моем. BitmapSource. IsFrozen == верный.

Какая-либо идея о том, как скопировать BitmapSource в другой поток (полностью не восстанавливая его от файла изображения в новом потоке)?

Править: Так, замораживание не помогает: В конце у меня есть BitmapFrame (Окно. Значок не берет никакой другой вид ImageSource так или иначе), и когда я назначаю его Окном. Значок на другом потоке, даже если замороженный, я получаю InvalidOperationException: "Вызывающий поток не может получить доступ к этому объекту, потому что другой поток владеет им". со следующим отслеживанием стека:

    WindowsBase.dll!System.Windows.Threading.Dispatcher.VerifyAccess() + 0x4a bytes 
    WindowsBase.dll!System.Windows.Threading.DispatcherObject.VerifyAccess() + 0xc bytes    
    PresentationCore.dll!System.Windows.Media.Imaging.BitmapDecoder.Frames.get() + 0xe bytes    
    PresentationFramework.dll!MS.Internal.AppModel.IconHelper.GetIconHandlesFromBitmapFrame(object callingObj = {WPFControls.WPFMBox.WpfMessageBoxWindow: header}, System.Windows.Media.Imaging.BitmapFrame bf = {System.Windows.Media.Imaging.BitmapFrameDecode}, ref MS.Win32.NativeMethods.IconHandle largeIconHandle = {MS.Win32.NativeMethods.IconHandle}, ref MS.Win32.NativeMethods.IconHandle smallIconHandle = {MS.Win32.NativeMethods.IconHandle}) + 0x3b bytes   
>   PresentationFramework.dll!System.Windows.Window.UpdateIcon() + 0x118 bytes  
    PresentationFramework.dll!System.Windows.Window.SetupInitialState(double requestedTop = NaN, double requestedLeft = NaN, double requestedWidth = 560.0, double requestedHeight = NaN) + 0x8a bytes  
    PresentationFramework.dll!System.Windows.Window.CreateSourceWindowImpl() + 0x19b bytes  
    PresentationFramework.dll!System.Windows.Window.SafeCreateWindow() + 0x29 bytes 
    PresentationFramework.dll!System.Windows.Window.ShowHelper(object booleanBox) + 0x81 bytes  
    PresentationFramework.dll!System.Windows.Window.Show() + 0x48 bytes 
    PresentationFramework.dll!System.Windows.Window.ShowDialog() + 0x29f bytes  
    WPFControls.dll!WPFControls.WPFMBox.WpfMessageBox.ShowDialog(System.Windows.Window owner = {WPFControlsTest.MainWindow}) Line 185 + 0x10 bytes  C#
5
задан abatishchev 24 February 2012 в 22:28
поделиться

1 ответ

Как только вы вызовете Freeze, он должен работать на нескольких потоках.

7
ответ дан 18 December 2019 в 11:54
поделиться
Другие вопросы по тегам:

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