使用C# 2.0,怎么使用多线程安全的调用非当前线程创建的控件,我看了MSDN中的方法但没看太明白,在调用时会出现异常.
//我的调用方法如下
internal delegate void ReloadDelegate();
internal void Reload()
{
   //执行代码,操作控件
}
internal void ThreadM()
{
   //在线程中调用访问操作方法
   this.DataGridView.Invoke(new ReloadDelegate(Reload));
}
Thread thread = new Thread(new ThreadStart(ThreadM));
thread.Start();我是这样操作的,但有时会出现异常,不知道是什么地方出错.

解决方案 »

  1.   

    哈哈,我来说一下把,这个要牵涉到windows的底层实现了.你调用control无非就两种方法,一种是control.属性 ,注意这种对应于win32 api是sendmessage,这个函数的缺点就是我发出去的消息你不入消息栈,直接响应.你可以想象别人在做某事,作了一半,你要他放手响应你.你是不是很霸道啊?由于多线程的存在,所以这种行为不好,ms帮你屏蔽了.如果你要强行做,只能用sendmessage了.
    另外你上面提到的,其实对应是postmessage,这个方法友好多了,他只是告诉control你下一步要做什么,不必马上响应..net说到底都是mfc做出来的,mfc是win32的封装.
      

  2.   

    在窗体的构造函数中加入
    System.Windows.Forms.Form.CheckForIllegalCrossThreadCalls = false;
    就和2003一样了
      

  3.   

    那如果我想在一个线程中操作这个控件该如何做呢?
    不想使用这种方法,CheckForIllegalCrossThreadCalls = false; MSDN上说这样会出现问题,
    主线程要负任显示UI,而使用一个线程来对数据进行查询并将数据绑定到控件上。//执行代码,操作控件,绑定数据
    this.DataGridView.DataSource = this.dataView;