线程间控件安全访问问题

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事件.其中,参数可以在ProgressChangedEventArgsworker_ProgressChanged(object sender, ProgressChangedEventArgs e))中得到
. CancelAsync() :取消(暂停)执行。
我们可以使用这个控件的. RunWorkerAsync()方法开始执行事件一中的任务。
如果在事件一种没有东西执行,实际上就是执行完毕,就会执行事件二。
如果我们在事件一中响应的执行了ReportProgress这个方法。那么就会触发事件三。
当然也可以在其它过程中触发ReportProgress这个方法。有个前提是必须能向外报告进度。
但是不知道到底怎么报告这个进度,没有现成的东西学习。但是可以解决上边的问题了。
就是去执行上边的东西。
留个尾巴。
综上所述就是有三种方法来解决上边的问题了。

你可能感兴趣的:(String,object,C#,工具,任务,textbox)