## 方法一 ##
    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; 即可