Rik*_*erg 5 c# wpf multithreading textbox
在WPF应用程序中,我使用自定义样式的Textbox,其中ContextMenu被覆盖如下:
<Style TargetType="{x:Type TextBox}">
<Setter Property="ContextMenu">
<ContextMenu>
<MenuItem Header="Copy"/>
</ContextMenu>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
这完全有效,直到我在不同的线程中使用TextBox运行窗口,如下所示:
Thread thread = new Thread(()=>
{
TestWindow wnd = new TestWindow();
wnd.ShowDialog();
});
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
Run Code Online (Sandbox Code Playgroud)
但这会导致InvalidOperationException"调用线程无法访问此对象,因为另一个线程拥有它."
如何避免这个问题?
问题是您的样式被重用为优化,因此ContextMenu被重用 - 这是标准的,适用于单线程,但不适用于多线程.
我会尝试将样式移动到resourcedictionary并将其作为StaticResource引用,然后我将标记:x:Shared ="false"这将在每次访问资源时创建一个新实例 - 我不确定它是否适用于"抓住所有"关键的减少风格.然后你可以将contextmenu作为一个资源并将其作为StaticResource引用 - 应该这样做.