线程间控件安全访问问题

c#2.0 中,一个线程是不能访问另一个线程创建的控件的。这个问题的解决有。
1、  设置 System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
2、  使用委托的方式访问控件。
A 、首先声明一个委托。参数是要和控件需要的参数一致。
B 、然后设计这个委托需要处理的方法。参数和委托的一致。在方法中去处理这个参数,访问另一线程中控件。
C 、在本线程中当要访问另一线程创建的控件的时候,就可以先判断是否该控件需要安全访问。
delegate void appendstringdelete(string text); 
if (textBox5.InvokeRequired)
            {
                appendstringdelete d = new appendstringdelete(kk);
                textBox5.Invoke(d, " 这样就可以用了" );
                //textBox5.AppendText("nihao");
            }
            else
            {
textBox5.AppendText("nihao");
}
Private void kk string text
{
textBox5.AppendText(text);
}
这样就能达到目的了。
3、  使用另一种机制, backgroundWorker 控件,来进行访问。
实际上是一个控件;引入方法是从工具栏中引入。
主要有三个事件。要进行注册。
 worker.DoWork += new DoWorkEventHandler(worker_DoWork);// 执行任务
  worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);// 任务结束时
worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged)// 报告状态
以下是方法
. WorkerReportsProgress :是否可以向外报告进度。
   .WorkerSupportsCancellation :是否可以暂停任务
   . CancellationPending 是否正在暂停中
   . RunWorkerAsync() 开始执行任务。触发 DoWork 事件
   . ReportProgress(int percentPrgress,object userState) 向外报告进度。触发 ProgressChanged 事件 . 其中,参数可以在 ProgressChangedEventArgs worker_ProgressChanged(object sender, ProgressChangedEventArgs e) )中得到
   . CancelAsync() :取消(暂停)执行。
我们可以使用这个控件的 . RunWorkerAsync() 方法开始执行事件一中的任务。
如果在事件一种没有东西执行,实际上就是执行完毕,就会执行事件二。
如果我们在事件一中响应的执行了 ReportProgress 这个方法。那么就会触发事件三。
当然也可以在其它过程中触发 ReportProgress 这个方法。有个前提是必须能向外报告进度。
但是不知道到底怎么报告这个进度,没有现成的东西学习。但是可以解决上边的问题了。
就是去执行上边的东西。
留个尾巴。
综上所述就是有三种方法来解决上边的问题了。

你可能感兴趣的:(职场,安全,控件,休闲,线程间)