因为在调用程序中的setStoreInfo方法显示数据的时候需要比较长时间,所以我想设置一个等待的窗口提示用户等待,具体的代码如下:private delegate void someMethodDelegate(int someArg); //委托函数定义
调用setStoreInfo方法的代码段,如下:someMethodDelegate smd = new someMethodDelegate(this.setStoreInfo);
IAsyncResult iar = smd.BeginInvoke(index, null, null);
/*等待提示窗口*/
WaitingForm wf = new WaitingForm();
wf.Show(this);
Application.DoEvents();
while (true)
{
    if (iar.IsCompleted)
    {
        wf.Close();
        break;
    }
}
smd.EndInvoke(iar);但在进入setStoreInfo方法执行的时候总是提示:线程间操作无效: 从不是创建控件“storeNo”的线程访问它。storeNo是主窗体中的一个控件,请问这是什么原因?

解决方案 »

  1.   

    需要invoke操作,看看控件的InvokeRequired和Invoke()的使用方法吧;
      

  2.   

    主线程外访问UI控件 参考写法 delegate void RefreshForm(string s);
    //主线程外操作界面的方法
            private void AddList(string s)
            {
                if (listBox1.InvokeRequired)
                {
                    Invoke(new RefreshForm(AddList), s);
                }
                else
                {
                    
                        listBox1.Items.Insert(0, s)          
                }
            }
      

  3.   

    需要invoke操作,看看控件的InvokeRequired和Invoke()的使用方法吧;
      

  4.   

    窗体里加 Control.CheckForIllegalCrossThreadCalls=false;
      

  5.   

    两个方法:
    1. 简单的.把你用线程的操作改成用BackgroundWorker. 这个很容易用.
    2. 调用控件上的BeginInvoke封送你对控件访问方法的调用.Control.CheckForIllegalCrossThreadCalls=false;这个不推荐用, 不安全的.