【发布时间】:2008-10-23 10:31:59
【问题描述】:
我有一个服务器应用程序,它通过网络接收信息并对其进行处理。 服务器是多线程的,一次处理多个套接字,线程是通过 BeginInvoke 和 EndInvoke 样式的方法在我的控制下创建的,这些方法由相应的回调函数链接。
除了主 GUI 之外,我正在尝试创建一个表单,该表单显示一个 ListBox 项目,该项目由描述当前连接的套接字的项目填充。 所以,我基本上想做的是使用它的 Add() 函数将一个项目添加到 ListBox 中,从线程中运行适当的回调函数。 我正在通过 Controls 属性访问我的表单控件 - I.E:
(ListBox)c.Controls["listBox1"].Items.Add();
当然我不只是调用函数,我尝试了几种我在这里和网络上找到的在线程之间通信的方法,包括MethodInvoker,使用delegate,结合Invoke() ,BeginInvoke() 等。
似乎没有任何效果,我总是得到同样的异常,告诉我我的控件是从创建它的线程之外的线程访问的。
有什么想法吗?
【问题讨论】:
-
一个相关的微妙之处是,如果您正在从控件读取,您通常希望使用 Invoke 而不是 BeginInvoke 来确保在继续之前填充当前线程中的目标变量。我认为我们还没有未来。 :)
标签: c# forms invoke multithreading