关于C#多线程调用的问题

我的窗体是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();//点击菜单显示子窗体的线程
    }

            请教大神这个用委托怎么写
c#

2个回答

就你的需求,根本看不出有用多线程的必要。

因为OpenTrainScheduleInquiryWindow全部都在操作界面。非要用,就得把这些全部写在Invoke委托中,但是那样其实这些操作还是在主线程执行。

u011382188
小珊珊爱吃鱼 主要是我的子窗体在创建的时候是在FormLoad事件中连接数据库,如果在连接数据库失败的情况下这个主窗体是卡死的状态,所以我才想试试用线程。那请问如果遇到我这种情况,怎么让他不卡住呢
5 年多之前 回复

楼主注意一下大小写,纯手打可能有些错误:

void 你的被线程调用的方法(){
////........CODE 这里是数据查询,可能会消耗一些时间

//这里是线程与控件做交互:
this.Invoke((Action)(()=>{
//你操作控件的代码写在这里
}));

} //方法结束

解释:invoke方法,在控件所在线程上执行一个委托
我这里使用了Action委托+匿名方法

注:绝大部分写委托的地方,都可以用一个匿名方法代替,编辑器会自动放入合适的委托,invoke方法是个例外。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐