0

这是这种情况:

我有一个在我的应用程序中实现 HTTP 服务器的类,所以我可以接受请求。此服务器的目标是使用发送到应用程序的 XML 刷新图形。

我编写的 XML 解析器使用了我制作的一个名为 NewMeshNode 的 UserControl,它具有一些属性和一对附加在同一个对象中的图像。当解析器到达创建新的 NewMeshNode 对象时,问题就出现了。

由于 NewMeshNode 对象具有图形部分,因此我使用委托并将 http 服务器线程单元状态更改为 STA。

这里我初始化本地http服务器:

App.localHttpServer = new MyHttpServer(8080);
App.localHttpServerThread = new Thread(new ThreadStart(App.localHttpServer.listen));
App.localHttpServerThread.SetApartmentState(ApartmentState.STA);
App.localHttpServerThread.Name = "HttpServerThread";
App.localHttpServerThread.Start();

这就是我要求解析器使用我收到的 XML 创建一个列表的方式:

public delegate ArrayList delListString(string s); 
.
.
.
delListString del = new delListString(App.parser.GetParameters);
App.nodeInfo = (ArrayList)Dispatcher.CurrentDispatcher.Invoke(del, tokens[0]);

这是解析器的一部分,我在其中创建了一个新的 NewMeshNode 对象来使用它:

public ArrayList GetParameters(string xml)
{
  ArrayList parameters=new ArrayList();
  int sensorCount = 0;

  MemoryStream ms = new MemoryStream();
  ms.Write(Encoding.UTF8.GetBytes(xml), 0, Encoding.UTF8.GetBytes(xml).Length);
  ms.Position = 0;
  byte[] byteArray = ms.ToArray();

  string resul = Encoding.UTF8.GetString(byteArray);

  resul = resul.Substring(resul.IndexOf("\n") + 1);

  byteArray = Encoding.UTF8.GetBytes(resul);
  MemoryStream rms = new MemoryStream(byteArray);

  XmlReaderSettings settings = new XmlReaderSettings();
  settings.IgnoreComments=true;
  settings.IgnoreWhitespace=true;

  XmlReader xmlr = XmlReader.Create(rms, settings);
  xmlr.Read();
  string xmlType = xmlr.Name;
  string currentElement="";
  string secondaryElement = "";
  NewMeshNode node = new NewMeshNode();
  .
  .
  .

这是 NewMeshNode 类:

公共部分类 NewMeshNode : UserControl {

    public string name = "";
    public string mac = "";
    public string address = "";
    public string state = "";
    public string type = "";
    public int pipeLive = 0;
    public double xOnGraph = 0.0;
    public double yOnGraph = 0.0;
    public string pointsTo = "";
    public ArrayList sensors = new ArrayList();
    public ArrayList oldAddress = new ArrayList();

    public NewMeshNode()
    {
        InitializeComponent();
    }
}

VS 总是在调试器进入构造函数时抛出 InvalidOperation 异常,提示信息:“调用线程必须是 STA,因为很多 UI 组件都需要这个。”

我究竟做错了什么?

提前致谢!

4

1 回答 1

1

由于主要原因是自我解释,线程应该是 STA 并且设置它并不能解决您的问题,所以您可以尝试本文中提到的一些技巧.. 像干净构建您的解决方案,Visual Studio 设置等.. http://social .msdn.microsoft.com/Forums/vstudio/en-US/d1e17dc5-ea88-453b-b87f-7154e6c6c75a/the-calling-thread-must-be-sta-because-many-ui-components-require-this

于 2013-09-04T11:39:17.057 回答