## 方法一 ##
public string BackgroundActions(string uriArg)
{
//你想在后台执行的操作
}
private void button1_Click(object sender, EventArgs e)
{
new System.Threading.Thread(delegate()
{
//调用后台执行函数
string strHtml = BackgroundActions("http://deng.youqiang.me");
// 后台执行部分
this.Invoke((EventHandler)delegate
{
//你想在前台进行的操作
richTextBox1.Text = strHtml;
// 操作UI部分
});
}).Start();
}
方法二
BackgroundWorker组件使用说明
一.概述
BackgroundWorker是·NET 2.0提供的一个多线程组件,在应用程序中使用,可以非常简单方便地实现UI控件通信,并自动处理多线程冲突问题。
二.基本属性
1.WorkerReportsProgress ,bool:是否允许报告进度;
2.WorkerSupportsCancellation,bool:是否允许取消线程。
3.CancellationPending,bool,get:读取用户是否取消该线程。
三.基本事件
1.DoWork:工作者线程
2.RunWorkerCompleted :线程进度报告
3.ProgressChanged:线程结束报告
四.基本方法
1.RunWorkerAsync() :启动工作者线程;
2.CancelAsync():取消工作者线程;
3.ReportProgress(int);报告进度
五.代码
//启动
private void btnStart_Click(object sender, EventArgs e){
this.btnStart.Enabled = false;
this.btnStop.Enabled = true;
this.backgroundWorker.RunWorkerAsync();
}
//通知线程停止
private void btnStop_Click(object sender, EventArgs e){
this.backgroundWorker.CancelAsync();
}
//工作者线程
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e){
for (int i = 0; i < 150; i++){
if (backgroundWorker.CancellationPending)//查看用户是否取消该线程
{
break;
}
System.Threading.Thread.Sleep(50);//干点实际的事
backgroundWorker.ReportProgress(i);//报告进度
}
}
//线程进度报告
private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e){
this.progressBar1.Value = e.ProgressPercentage * 100 / 150;
}
//线程结束报告
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){
this.btnStart.Enabled = true;
this.btnStop.Enabled = false;
}
六、BackGroundWorker解决“线程间操作无效: 从不是创建控件的线程访问它”
在主窗体的构造函数中加上C# Control.CheckForIllegalCrossThreadCalls = false;
即可