使用线程回调解决子线程无法操作主线程中定义的控件
最近在做一个c/s的项目,其中使用了wcf通信,当取数据库时,就要先通过代理类获得数据库的服务,开一个线程去不停地ping数据库服务器,这样就导致不能在窗体的load事件直接获取数据,只能再开一个线程来做控件绑定数据的工作,但由于子线程是无法操作主线程里定义的控件,所以只能用线程回调主线程来实现,下面是一个实例:
//委托
public delegate void SendToParent();
/// <summary>
///使用线程加载devicetype树
/// </summary>
private void bindtvwDeviceType()
{
//另外开启一个线程来绑定数据
Thread thread = new Thread(new ThreadStart(load));
thread.Start();
}
//treeview的绑定方法
private void DeviceTypeLoad()
{
List<entity.DeviceTypeEntity> models = deviceMAN.GetModelListDeviceType("");
TreeNode tmpNd;
foreach (entity.DeviceTypeEntity model in models)
{
tmpNd = new TreeNode();
tmpNd.Name = model.TypeID.ToString();
tmpNd.Text = model.TypeName;
tvwDeviceType.Nodes.Add(tmpNd);
// bindtvwDeviceType(tmpNd.Nodes, tmpNd.Name);//递归调用方法
}
}
/// <summary>
/// 使用线程回调主线程的控件
/// </summary>
private void load()
{
while (true)
{
if (deviceMAN != null)
{
//通过委托当子线程结束时回调主线程的方法
SendToParent send1 = new SendToParent(DeviceTypeLoad);
this.BeginInvoke(send1);
break;
}
else
{
Thread.Sleep(2000);
}
}
}