2 c# forms multithreading invoke
我有一个服务器应用程序,通过网络接收信息并对其进行处理.服务器是多线程的,并且一次处理多个套接字,并且通过BeginInvoke和EndInvoke样式方法在没有我控制的情况下创建线程,这些方法由相应的回调函数链接.
我正在尝试创建一个表单,除了主GUI之外,它还显示一个ListBox项目,该项目由描述当前连接的套接字的项目填充.所以,我基本上要做的是使用其Add()函数向ListBox添加一个项目,从该线程运行相应的回调函数.我通过Controls属性访问我的表单控件 - IE:
(ListBox)c.Controls["listBox1"].Items.Add();
Run Code Online (Sandbox Code Playgroud)
当然,我不只是调用函数,我试过几种方法,我在这里和在网络上找到线程间的通信,包括MethodInvoker,使用delegate,与组合Invoke(),BeginInvoke()等似乎没有任何工作,我总是得到同样的异常告诉我,我的控件是从一个创建它以外的线程访问的.
有什么想法吗?
我总是沿着这些方向使用一些东西:
c = <your control>
if (c.InvokeRequired)
{
c.BeginInvoke((MethodInvoker)delegate
{
//do something with c
});
}
else
{
//do something with c
}
Run Code Online (Sandbox Code Playgroud)
我还写了一堆辅助扩展方法来帮助.
using System;
using System.ComponentModel;
public static class CrossThreadHelper
{
public static bool CrossThread<T,R>(this ISynchronizeInvoke value, Action<T, R> action, T sender, R e)
{
if (value.InvokeRequired)
{
value.BeginInvoke(action, new object[] { sender, e });
}
return value.InvokeRequired;
}
}
Run Code Online (Sandbox Code Playgroud)
像这样使用:
private void OnServerMessageReceived(object sender, ClientStateArgs e)
{
if (this.CrossThread((se, ev) => OnServerMessageReceived(se, ev), sender, e)) return;
this.statusTextBox.Text += string.Format("Message Received From: {0}\r\n", e.ClientState);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1426 次 |
| 最近记录: |