C#多窗体,多线程编程

来源:百度知道 编辑:UC知道 时间:2024/06/15 08:31:52
我用了委托,FORM2为大厅窗口,其中ListBox显示房间列表,在Form2的窗体类中定义委托实例listboxCallback_f2
public MyInfo .SetListBoxItemCallBack listboxCallback_f2;//其中MyInfo为Form2外的一个类,SetListBoxItemCallBack为类中的静态委托名。

public Form2()
{
InitializeComponent();
listboxCallback_f2 = new MyInfo.SetListBoxItemCallBack(MyInfo.SetListBoxItem);
}
在Form2的Load事件中,由于我想在开启大厅的同时,使RoomlistBox随着接受UDP信息而同步刷新,所以我开启了 接受信息并处理RoomListBox的一个线程
Thread RecThread = new Thread(new ThreadStart(MyInfo.MyInfoReceiveAndSetListBoxItem));
//这个MyInfoReceiveAndSetListBoxItem发发也在MyInfo类中
RecThread.Start(ref RoomlistBox ,ref listboxCallback_f2 );
//后边两个是MyInfoReceiveAndSetListBoxItem的参数,我做成了引用

在MyInfo类中我定义了委托,是静态的方法
public delegate void SetListBoxItemCallBack(ListBox listbox,object text,string opreation);
//定义委托
下面是设置listBox方法:
public static void SetListBoxItem(ref SetListBoxItemCallBack listboxCallback,ListBox

你把委托SetListBoxItemCallBack的定义放到类MyInfo外面就可以了。

另外你用委托来回调SetListBoxItem,是因为担心跨线程访问对象吗?

那你这样做并不合适,可以用.Net的推荐机制:

在MyInfo中定义一个ISynchronizeInvoke对象synchronizingObject:
private ISynchronizeInvoke synchronizingObject;
public MyInfo(ISynchronizeInvoke so)
{
this.synchronizingObject = so;
}

然后根据不同的Form,实例化MyInfo时给他赋值,比如
MyInfo mi = new MyInfo(Form2);
MyInfo mi = new MyInfo(Form3);

这样,你在MyInfo中要更新特定form上的ListBox,只要在this.synchronizingObject上调用Invoke()或者BeginInvoke()就代表了对特定form上的ListBox的操作,不会有跨线程访问的问题了。比如:
if(this.synchronizingObject.InvokeRequired)
{
this.synchronizingObject.BeginInvoke(delegate(){//更新ListBox}, new object[] { // listBox参数 });
}

这时,MyInfoReceiveAndSetListBoxItem(ListBox listBox)虽然在子线程中运行,但它有指向特定Form的synchronizingObject,所以仍然可以安全的更新Form上的ListBox,这个函数也只需要接受一个ListBox参数就行了。

晕乎乎的!