これは状況です:
アプリケーションに 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 である必要があります。」
私は何を間違っていますか?
前もって感謝します!