C#编程:多线程与UI操作

为了让程序尽快响应用户操作,在开发Windows应用程序时经常会使用到线程。对于耗时的操作如果不使用线程将会是UI界面长时间处于停滞状态,这种情况是用户非常不愿意看到的,在这种情况下我们希望使用线程来解决这个问题。

    简单贴出几种处理情况的代码,慢慢琢磨吧!

[csharp]  view plain copy
  1. using System;   
  2. using System.Collections.Generic;   
  3. using System.ComponentModel;   
  4. using System.Data;   
  5. using System.Drawing;   
  6. using System.Linq;   
  7. using System.Text;   
  8. using System.Windows.Forms;   
  9. using System.Threading;   
  10.    
  11. namespace ThreadPoolDemo   
  12. {   
  13.         public partial class ThreadForm : Form   
  14.         {   
  15.                 //定义delegate以便Invoke时使用   
  16.                 private delegate void SetProgressBarValue(int value);   
  17.                 private BackgroundWorker worker;   
  18.                 public ThreadForm()   
  19.                 {   
  20.                         InitializeComponent();   
  21.                 }   
  22.    
  23.                 private void btnThread_Click(object sender, EventArgs e)   
  24.                 {   
  25.                         progressBar.Value = 0;   
  26.                         //指示是否对错误线程的调用,即是否允许在创建UI的线程之外访问线程   
  27.                         //CheckForIllegalCrossThreadCalls = false;   
  28.                         Thread thread = new Thread(new ThreadStart(Run));   
  29.                         thread.Start();   
  30.                 }   
  31.                 //使用线程来直接设置进度条   
  32.                 private void Run()   
  33.                 {   
  34.                         while (progressBar.Value < progressBar.Maximum)   
  35.                         {   
  36.                                 progressBar.PerformStep();   
  37.                         }   
  38.                 }   
  39.    
  40.                 private void btnInvoke_Click(object sender, EventArgs e)   
  41.                 {   
  42.                         progressBar.Value = 0;   
  43.                         Thread thread = new Thread(new ThreadStart(RunWithInvoke));   
  44.                         thread.Start();   
  45.                 }   
  46.                 //使用Invoke方法来设置进度条   
  47.                 private void RunWithInvoke()   
  48.                 {   
  49.                         int value = progressBar.Value;   
  50.                         while (value< progressBar.Maximum)   
  51.                         {   
  52.                                 //如果是跨线程调用   
  53.                                 if (InvokeRequired)   
  54.                                 {   
  55.                                         this.Invoke(new SetProgressBarValue(SetProgressValue), value++);   
  56.                                 }   
  57.                                 else   
  58.                                 {   
  59.                                         progressBar.Value = ++value;   
  60.                                 }   
  61.                         }   
  62.                 }   
  63.                 //跟SetProgressBarValue委托相匹配的方法   
  64.                 private void SetProgressValue(int value)   
  65.                 {   
  66.                         progressBar.Value = value;   
  67.                 }   
  68.    
  69.                 private void btnBackgroundWorker_Click(object sender, EventArgs e)   
  70.                 {   
  71.                         progressBar.Value = 0;   
  72.                         worker = new BackgroundWorker();   
  73.                         worker.DoWork += new DoWorkEventHandler(worker_DoWork);   
  74.                         //当工作进度发生变化时执行的事件处理方法   
  75.                         worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);   
  76.                         //当事件处理完毕后执行的方法   
  77.                         worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);   
  78.                         worker.WorkerReportsProgress = true;//支持报告进度更新   
  79.                         worker.WorkerSupportsCancellation = false;//不支持异步取消   
  80.                         worker.RunWorkerAsync();//启动执行   
  81.                         btnBackgroundWorker.Enabled = false;   
  82.                 }   
  83.                 //当事件处理完毕后执行的方法   
  84.                 void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)   
  85.                 {   
  86.                         btnBackgroundWorker.Enabled=true;   
  87.                 }   
  88.                 //当工作进度发生变化时执行的事件处理方法   
  89.                 void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)   
  90.                 {   
  91.                         //可以在这个方法中与界面进行通讯   
  92.                         progressBar.Value = e.ProgressPercentage;   
  93.                 }   
  94.                 //开始启动工作时执行的事件处理方法   
  95.                 void worker_DoWork(object sender, DoWorkEventArgs e)   
  96.                 {   
  97.                         int value = progressBar.Value;   
  98.                         while (value < progressBar.Maximum)   
  99.                         {   
  100.                                 worker.ReportProgress(++value);//汇报进度   
  101.                         }   
  102.                 }   
  103.                 //使用System.Windows.Forms.Timer来操作界面能   
  104.                 private void btnTimer_Click(object sender, EventArgs e)   
  105.                 {   
  106.                         progressBar.Value = 0;   
  107.                         //注意在.net中有多个命名空间下存在Timer类,为了便于区别,使用了带命名空间形式   
  108.                         System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();   
  109.                         timer.Interval = 1;   
  110.                         timer.Tick += new EventHandler(timer_Tick);   
  111.                         timer.Enabled = true;   
  112.                 }   
  113.                 //Timer中要定期执行的方法   
  114.                 void timer_Tick(object sender, EventArgs e)   
  115.                 {   
  116.                         int value = progressBar.Value;   
  117.                         if (value < progressBar.Maximum)   
  118.                         {   
  119.                                 progressBar.Value = value+100;   
  120.                         }   
  121.                 }   
  122.         }   
  123. }   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值