在
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
这个方法。有个前提是必须能向外报告进度。
但是不知道到底怎么报告这个进度,没有现成的东西学习。但是可以解决上边的问题了。
就是去执行上边的东西。
留个尾巴。
综上所述就是有三种方法来解决上边的问题了。