我在写一个程序!实现效果如下
1:从数据库读取待发数量;显示在窗体中
2:从数据库读取失败数量:显示在窗体中
3: 从数据库读取发送量:显示在窗体中
4:有一个timer控件 每隔3秒就到数据库中读取待发数量  读到就把信息发送出去(信息量很大)!当然并不是一次性发送完!
是分批发送,发送一批我就删除一批!并在窗体中从新显示待发数量和失败数量,发送量如果是单线程的话,发送信息的时候 程序就会出现无响应状态,假死
为发送单独开一个线程就会 :报线程间操作无效,从不是创建控件的线程访问它
我在网在也找了一些方法!都没成功!请各位前辈不吝赐教谢谢由于本人分数不是很多!
所以分数给的有点少!
不好意思!

解决方案 »

  1.   

    你可以在窗体的构造函数上加一句:Form.CheckIllegal... = false;//属性名我记不清楚了,你自己感应一下
      

  2.   

    在主窗体的构造函数中加上  Control.CheckForIllegalCrossThreadCalls = false; 即可
      

  3.   

    线程间调用控件要用委托
    定义一个委托比如 delegate void MyDelegate();
    Mydelegate del=new Mydelegate (MyFun);
    this.BeginInvoke(del);MyFun是一个你自己写的方法,里面包含了你要线程间操作控件的代码
      

  4.   

    在主窗体的构造函数中加上 Control.CheckForIllegalCrossThreadCalls = false; 即可
      

  5.   

    上面已经说了用一个委托就行。delegate void MyDelegate();
    Mydelegate del=new Mydelegate (MyFun);
    this.BeginInvoke(del);private MyFun()
    {
        //这里面执行向窗体控件幅值的语句
    }当然也可以用lamuda表达式,更方便一些
    this.BeginInvoke(action=> //这里面执行向窗体控件幅值的语句;);
    或者使用BackgroundWorker组件,例子很多,google上搜一下吧
      

  6.   

    会带来潜在的安全问题,LZ在非UI线程中访问了控件,顶下6#if (txtMessage.InvokeRequired)
    {
         InvokeCallback msgCallback =   new InvokeCallback(m_comm_MessageEvent);
         txtMessage.Invoke(msgCallback, new   object []   { msg } );
    }
    http://www.cnblogs.com/zyh-nhy/archive/2007/12/25/1014749.html
      

  7.   

    委托如果是填充到gridview的话,还是会有问题的.
      

  8.   

    委托调用的那个函数中 MyFun
    实际是让UI线程去操作.界面当然会假死.
    尽量少在MyFun中做操作.