我的窗体是MDI多文档窗体,我在主窗体顶部天界了菜单,点击菜单弹出子窗体,但是因为我要用到数据库,所以我想在点击窗体这块使用线程,但是提示错误说线程间操作无效: 从不是创建控件"MainWindow"的线程访问它.,我看到论坛中说用到委托,可是我还不会,请教大神。
private void OpenTrainScheduleInquiryWindow() //线程用到的函数
{
if (trainScheduleInquiry == null || trainScheduleInquiry.IsDisposed)
{
trainScheduleInquiry = new TrainScheduleInquiryWindow();
trainScheduleInquiry.MdiParent = this;
trainScheduleInquiry.Show();
}
else
{
trainScheduleInquiry.WindowState = FormWindowState.Maximized;
trainScheduleInquiry.Activate();
}
}
private void Menu_TrainScheduleInquiry_Click(object sender, EventArgs e)
{
Thread openWindow = new Thread(OpenTrainScheduleInquiryWindow);
openWindow.Start();//点击菜单显示子窗体的线程
}
请教大神这个用委托怎么写
就你的需求,根本看不出有用多线程的必要。
因为OpenTrainScheduleInquiryWindow全部都在操作界面。非要用,就得把这些全部写在Invoke委托中,但是那样其实这些操作还是在主线程执行。
楼主注意一下大小写,纯手打可能有些错误:
void 你的被线程调用的方法(){
////........CODE 这里是数据查询,可能会消耗一些时间
//这里是线程与控件做交互:
this.Invoke((Action)(()=>{
//你操作控件的代码写在这里
}));
} //方法结束
解释:invoke方法,在控件所在线程上执行一个委托
我这里使用了Action委托+匿名方法
注:绝大部分写委托的地方,都可以用一个匿名方法代替,编辑器会自动放入合适的委托,invoke方法是个例外。