【发布时间】:2013-09-04 19:39:17
【问题描述】:
情况是这样的:
我有一个在我的应用程序中实现 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 组件都需要这个。”
我做错了什么?
提前致谢!
【问题讨论】:
-
因为主要原因是自我解释,线程应该是 STA 并且设置它并不能解决您的问题,所以您可以尝试本文中提到的一些技巧.. 像干净构建您的解决方案,Visual Studio 设置等等。social.msdn.microsoft.com/Forums/vstudio/en-US/…
-
App.localHttpServerThread.Join(); App.localHttpServerThread.Start() 之后;
-
很高兴它对您有用.. 让我们给出答案,以便其他人可以从中受益..
-
@nit:感谢您的链接,它帮助我找到了解决方案。
-
@Krish:您的解决方案不起作用,因为我有很多视觉元素没有出现,因为我一直在等待响应。
标签: c# wpf multithreading sta