我的思路:
事件发送类
//声明事件委托
public delegate void AddUserEventHandle(object sender, AddUserEventArgs e);
//事件触发方法,部分代码
if (!UserList.ContainsKey(a[0]))
{
//将用户信息临时保存到hashtablez中
UserList.Add(a[0], s);
//此处出发事件,通知服务器界面增加一个用户数据;
mAddUserEventArgs.UserName = a[0];
mAddUserEventArgs.IpAddress = a[1];
OnAddUser(mAddUserEventArgs);
//启动线程
Thread t = new Thread(new ParameterizedThreadStart(AcceptOneSocket));
t.Start(s);
}
//事件调用方法
protected virtual void OnAddUser(AddUserEventArgs e)
{
if (eAddUserEvent != null)
{
eAddUserEvent(this, e);
}
}
事件接收类
//构造函数中订阅事件
public FrmServer()
{
InitializeComponent();
mQQTCPListner = new QQTCPListner();
mQQTCPListner.eAddUserEvent += new AddUserEventHandle(mQQTCPListner_eAddUserEvent);
}
//事件处理方法
void mQQTCPListner_eAddUserEvent(object sender, AddUserEventArgs e)
{
item = new ListViewItem();
//item
item.Text = "选项一"; //显示文字
item.Tag = "001"; //设置tag 用于隐藏信息 比如主键
// item.ImageIndex = 0; //对应在imagelist中图片索引
item.SubItems.Add(e.UserName);
item.SubItems.Add(e.IpAddress);
lvwUserList.Items.Add(item); //将列表项加入到ListView中
}问题:程序运行到事件调用方法中eAddUserEvent 对象为空;可调试时明明mQQTCPListner.eAddUserEvent += new AddUserEventHandle(mQQTCPListner_eAddUserEvent);有调用啊,什么问题啊?
事件发送类
//声明事件委托
public delegate void AddUserEventHandle(object sender, AddUserEventArgs e);
//事件触发方法,部分代码
if (!UserList.ContainsKey(a[0]))
{
//将用户信息临时保存到hashtablez中
UserList.Add(a[0], s);
//此处出发事件,通知服务器界面增加一个用户数据;
mAddUserEventArgs.UserName = a[0];
mAddUserEventArgs.IpAddress = a[1];
OnAddUser(mAddUserEventArgs);
//启动线程
Thread t = new Thread(new ParameterizedThreadStart(AcceptOneSocket));
t.Start(s);
}
//事件调用方法
protected virtual void OnAddUser(AddUserEventArgs e)
{
if (eAddUserEvent != null)
{
eAddUserEvent(this, e);
}
}
事件接收类
//构造函数中订阅事件
public FrmServer()
{
InitializeComponent();
mQQTCPListner = new QQTCPListner();
mQQTCPListner.eAddUserEvent += new AddUserEventHandle(mQQTCPListner_eAddUserEvent);
}
//事件处理方法
void mQQTCPListner_eAddUserEvent(object sender, AddUserEventArgs e)
{
item = new ListViewItem();
//item
item.Text = "选项一"; //显示文字
item.Tag = "001"; //设置tag 用于隐藏信息 比如主键
// item.ImageIndex = 0; //对应在imagelist中图片索引
item.SubItems.Add(e.UserName);
item.SubItems.Add(e.IpAddress);
lvwUserList.Items.Add(item); //将列表项加入到ListView中
}问题:程序运行到事件调用方法中eAddUserEvent 对象为空;可调试时明明mQQTCPListner.eAddUserEvent += new AddUserEventHandle(mQQTCPListner_eAddUserEvent);有调用啊,什么问题啊?
public delegate void AddUserEventHandle(object sender, AddUserEventArgs e);
//事件数据类
public class AddUserEventArgs: EventArgs
{
public string UserName
{
get;
set;
}
public string IpAddress
{
get;
set;
}
}
//触发事件方法
protected virtual void OnAddUser(AddUserEventArgs e)
{
if (eAddUserEvent != null)
{
eAddUserEvent(this, e);
}
} //构造函数
public QQTCPListner()
{
UserList = new Hashtable();
mIPAddress = Dns.GetHostAddresses("127.0.0.1")[0];
mIPEndPoint = new IPEndPoint(mIPAddress,9001);
QQTCPServer = new TcpListener(mIPEndPoint);
mAddUserEventArgs = new AddUserEventArgs();
}
//启动监听
public void StartServer()
{
string fn = "StartServer";
LoggerUtil.WriteLogIn(unit, fn);
try
{
QQTCPServer.Start();
byte[] b = new byte[1024];
string temp = string.Empty;
string[] a;
while (true)
{
Socket s = QQTCPServer.AcceptSocket();
s.Receive(b);
temp = Encoding.GetEncoding("gb2312").GetString(b);
//除去末尾的“\0”
temp = temp.TrimEnd("\0".ToCharArray());
if (!string.IsNullOrEmpty(temp))
{
//a = temp.Split("||".ToCharArray());
a = Regex.Split(temp, @"\|\|", RegexOptions.IgnoreCase);
// 判断该用户是否存在于UserList中
if (!UserList.ContainsKey(a[0]))
{
//将用户信息临时保存到hashtablez中
UserList.Add(a[0], s);
//此处出发事件,通知服务器界面增加一个用户数据;
mAddUserEventArgs.UserName = a[0];
mAddUserEventArgs.IpAddress = a[1];
OnAddUser(mAddUserEventArgs);
//启动线程
Thread t = new Thread(new ParameterizedThreadStart(AcceptOneSocket));
t.Start(s);
}
}
}
}
catch (Exception ex)
{ LoggerUtil.WriteLogException(unit, fn,ex );
throw ex;
}////事件订阅类,在一个Form里面
private void Form1_Load(object sender, EventArgs e)
{
//监听事件
mQQTCPListner.eAddUserEvent += new AddUserEventHandle(mQQTCPListner_eAddUserEvent);
SetListView();
} void mQQTCPListner_eAddUserEvent(object sender, AddUserEventArgs e)
{
item = new ListViewItem();
//item
item.Text = "选项一"; //显示文字
item.Tag = "001"; //设置tag 用于隐藏信息 比如主键
// item.ImageIndex = 0; //对应在imagelist中图片索引
item.SubItems.Add(e.UserName);
item.SubItems.Add(e.IpAddress);
lvwUserList.Items.Add(item); //将列表项加入到ListView中
}