Wpf应用程序中的STA线程异常

时间:2014-01-24 14:42:16

标签: c# .net wpf multithreading sta

我有一个像这样的wpf应用程序:

public CreateProject()
        {
            InitializeComponent();
            _3DCAO.Temporary3DCAO.Close = false;
            Userinitial fen = new Userinitial();
            container.Content = fen;
            Thread windowThread2 = new Thread(delegate() { verifing2(); });
            windowThread2.IsBackground = true;
            windowThread2.Start();
        }
public void verifing2()
        {
            bool condition_accomplished = false;
            while (!condition_accomplished)
            {
                if (Temporary3DCAO.Etape == 1)
                {

                    _3DCAO.Settings set = new Settings();
                    if (container.Dispatcher.CheckAccess())
                    {

                        container.Content = set;
                    }
                    else
                    {

                        container.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() =>
                        {
                            container.Content = set;
                        }));

                    }
                    condition_accomplished = true;

                }
            }

        }

在方法Verifing中,我想实现User Control

_3DCAO.Settings set = new Settings();

但是出现了这个错误:

The calling thread must be STA, as required by many components of the user interface

  1. 为什么会出现此异常?
  2. 我该如何解决?

1 个答案:

答案 0 :(得分:1)

WPF(实际上所有Windows GUI交互)必须在单个GUI线程上进行任何GUI交互,因为GDI(在Windows中处理GUI的子系统)是单线程的。一切都必须在那个线程上。该线程也是一个STA线程。

您正在更改容器,设置内容,并且您正在错误的线程上执行此操作。有办法让它到正确的线程。

在构造函数中或在调用InitializeComponents()之后,添加此

this.guiContext = SynchronizationContext.Current;

..其中guiContext的类型为System.Threading.SynchronizationContext。然后,您可以将工作发送到GUI线程:

guiContext.Send(this.OnGuiThread, temp);

OnGuiThread是一个以对象为参数的方法,temp是发送给它的对象。

这意味着重新组织代码,因为您不仅需要在线程上创建GUI对象(如代码中的“set”),而且只能在该线程上更改它们。

干杯 -