1、this.InvokeRequired,说白了就是判断当前线程是否为UI线程,如果不是UI线程(this.InvokeRequired = true),需要通过this.Invoke去调用窗体控件(给listbox1添加Item),否则可以直接操作窗体控件。
2、打断点,单步调试有什么问题吗?

解决方案 »

  1.   

    你这句话不就是控制线程安全吗,listBox1.Items.Add("the count is:" + paramString);这句话只有ui线程才能调用的
      

  2.   

    DoGUIUpdate这个函数,不就是个递归调用吗
    第一次调用,是在线程中,然后判断非UI线程,于是用委托再次执行自身
    再次执行时,是在UI线程里调用,于是进入else你说无法加断点,你把断点加到哪里了?
      

  3.   

    我怎么赶脚你的代码有点混乱呢,如果你想用backgroundworkder的话,可以直接完全按照backgroundworker的方法来做,这个是支持控件操作的,直接拖拽即可至于更新listview,你可以在do_work里边执行完了以后,用传递参数的办法传递到相应的
     private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)来操作UI线程和backgroundworder线程一般不建议直接进行数据交互,最好做一个托管,例如 backgroundWorker1_ProgressChanged
            private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
            {
                //具体操作
                webBrowser1.Navigate("http://www.baidu.com");
                backgroundWorker2.ReportProgress(0,string.Format("{0}","可以是listview需要操作的地方"));
            }        private void backgroundWorker2_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                //线程交互,可以对UI进行处理,数据来自e.userstata as object (你想转换的数据类型)
                string s = e.UserState.ToString();
            }        private void backgroundWorker2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                //线程执行完成后的操作
            }
      

  4.   

    backgroundWorker本身是为了简化跨线程处理
    用了backgroundWorker就可以不用委托
    否则直接起线程,使用委托,抛开backgroundWorker