0

これは状況です:

アプリケーションに HTTP サーバーを実装するクラスがあるので、リクエストを受け取ることができます。このサーバーの目的は、アプリケーションに送信された XML を使用してグラフを更新することです。

私が作成した XML パーサーは、私が作成した NewMeshNode と呼ばれる UserControl を使用します。この UserControl には、いくつかの属性と、同じオブジェクトに添付された 1 組の画像があります。問題は、パーサーが新しい 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 例外をスローし、「多くの UI コンポーネントがこれを必要とするため、呼び出しスレッドは STA である必要があります。」

私は何を間違っていますか?

前もって感謝します!

4

1 に答える 1

1

主な理由は、スレッドが STA である必要があり、それを設定しても問題が解決しないという自明であるため、この記事に記載されているいくつかのトリックを試すことができます..クリーンビルドソリューション、ビジュアルスタジオ設定など.. 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 に答える