C# 创建矩形时,调用线程必须是STA

C# 创建矩形时,调用线程必须是STA,c#,wpf,C#,Wpf,您好,我尝试在wpf应用程序中创建一个矩形,我收到了这个错误。我尝试用谷歌搜索它,但没有成功 错误: The calling thread must be STA, because many UI components require this. 代码: 我认为这会解决问题: Application.Current.Dispatcher.BeginInvoke( DispatcherPriority.Background, new Action(() => this.progressBa

您好,我尝试在wpf应用程序中创建一个矩形,我收到了这个错误。我尝试用谷歌搜索它,但没有成功

错误:

The calling thread must be STA, because many UI components require this.
代码:

我认为这会解决问题:

Application.Current.Dispatcher.BeginInvoke(
DispatcherPriority.Background,
new Action(() => this.progressBar.Value = 50));
但是,这是否会消除使用不同线程的目的,因为这样所有渲染仍将在主线程上完成

还有一个问题:

我试着画一个一个一个的矩形,如果它们彼此相碰,就检测碰撞。一个循环设置它们的x-。
我也可以对像素执行此操作吗?

渲染应始终在主线程上执行。这是Windows/Win32中的设计问题

由于Win32的原始设计涉及到windows(也称为hWnd)的句柄,因此调用绘制操作的线程必须与实际绘制的线程相同


MSDN上有一篇关于的好文章。

只有主线程才能绘制多个线程仅用于计算绘制只能在主线程上进行。应始终在主线程上执行渲染。这是Windows/Win32中的设计问题。创建UI控件的线程必须始终是STA。尝试添加_render.setApartmentState.STA;在_render.start之前,您的代码走错了方向。这不是WPF的思维方式。在wpfland中,您希望保留对象,并根据需要更新对象上的属性。您不需要在WPF中渲染过程,这与许多游戏引擎的理念相反。
Application.Current.Dispatcher.BeginInvoke(
DispatcherPriority.Background,
new Action(() => this.progressBar.Value = 50));