2014-05-13 67 views
0

你好,我尝试在wpf应用程序中创建一个矩形,我收到这个错误,我试着用google搜索它,但它没有工作。创建矩形时,调用线程必须是STA

错误:

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

代码:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using System.Threading; 

namespace Game 
{ 
    class Engine 
    { 
     #region Members 

     private Thread _render; 

     #endregion 

     public Engine() 
     { 
      _render = new Thread(new ThreadStart(Render)); 
      _render.Start(); 
     } 

     private void Render() 
     { 
      while (true) 
      { 
       Rectangle rect = new Rectangle(); 
      } 
     } 
    } 
} 

我认为这将解决这个问题:

Application.Current.Dispatcher.BeginInvoke(
DispatcherPriority.Background, 
new Action(() => this.progressBar.Value = 50)); 

但不说带走使用不同的线程的目的因为那么所有的渲染仍然会在主线程上完成。

而另一个问题:

我试图通过1划出1矩形和碰撞检测,如果他们在彼此“下降”(一回路将其x--)。 我也可以用像素来做到这一点吗?

+1

只有主线程可以绘制多个线程只能用于计算绘图只能在主线程上。 –

+6

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

+0

创建UI控件的线程必须始终为STA。尝试添加_render.SetApartmentState(ApartmentState.STA);在_render.Start()之前 – Dinesh

回答

0

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

由于Win32的原始设计(涉及窗口的句柄,又名hWnd's),调用绘画操作的线程必须与做实际绘画的线程相同。

关于Threading model and WPF,MSDN上有一篇很好的文章。

相关问题