C#如何进行多线程编程


由于多线程编程非常复杂,这个小例子只能算是一个入门线的知识点吧

首先建一个应用程序项目,命名为ThreadExample,在窗体上放一个文本框(textBox1) ,一个标签(lblResult),再放两个按钮,分别命名为btnStart、btnStop。

窗体代码:



namespace 
   ThreadExample
{
    partial  
  class 
   ThreadExample
    {
         
  /**/ 
  /// 
    
  <summary> 
  
         
  /// 
   Required designer variable.
         
  /// 
    
  </summary> 
  
 
           
  private 
   System.ComponentModel.IContainer components  
  = 
    
  null 
  ;

         
  /**/ 
  /// 
    
  <summary> 
  
         
  /// 
   Clean up any resources being used.
         
  /// 
    
  </summary> 
  
         
  /// 
    
  <param name="disposing"> 
  true if managed resources should be disposed; otherwise, false. 
  </param> 
  
 
           
  protected 
    
  override 
    
  void 
   Dispose( 
  bool 
   disposing)
        {
             
  if 
   (disposing  
  && 
   (components  
  != 
    
  null 
  ))
            {
                components.Dispose();
            }
             
  base 
  .Dispose(disposing);
        }

        Windows Form Designer generated code 
  #region 
   Windows Form Designer generated code 
  

         
  /**/ 
  /// 
    
  <summary> 
  
         
  /// 
   Required method for Designer support - do not modify
         
  /// 
   the contents of this method with the code editor.
         
  /// 
    
  </summary> 
  
 
           
  private 
    
  void 
   InitializeComponent()
        {
             
  this 
  .btnStart  
  = 
    
  new 
   System.Windows.Forms.Button();
             
  this 
  .btnStop  
  = 
    
  new 
   System.Windows.Forms.Button();
             
  this 
  .button1  
  = 
    
  new 
   System.Windows.Forms.Button();
             
  this 
  .textBox1  
  = 
    
  new 
   System.Windows.Forms.TextBox();
             
  this 
  .lblResult  
  = 
    
  new 
   System.Windows.Forms.Label();
             
  this 
  .SuspendLayout();
             
  // 
   
             
  // 
   btnStart
             
  // 
    
  
 
               
  this 
  .btnStart.Location  
  = 
    
  new 
   System.Drawing.Point( 
  14 
  ,  
  38 
  );
             
  this 
  .btnStart.Name  
  = 
    
  " 
  btnStart 
  " 
  ;
             
  this 
  .btnStart.Size  
  = 
    
  new 
   System.Drawing.Size( 
  75 
  ,  
  23 
  );
             
  this 
  .btnStart.TabIndex  
  = 
    
  0 
  ;
             
  this 
  .btnStart.Text  
  = 
    
  " 
  启动 
  " 
  ;
             
  this 
  .btnStart.Click  
  += 
    
  new 
   System.EventHandler( 
  this 
  .btnStart_Click);
             
  // 
   
             
  // 
   btnStop
             
  // 
    
  
 
               
  this 
  .btnStop.Location  
  = 
    
  new 
   System.Drawing.Point( 
  14 
  ,  
  68 
  );
             
  this 
  .btnStop.Name  
  = 
    
  " 
  btnStop 
  " 
  ;
             
  this 
  .btnStop.Size  
  = 
    
  new 
   System.Drawing.Size( 
  75 
  ,  
  23 
  );
             
  this 
  .btnStop.TabIndex  
  = 
    
  1 
  ;
             
  this 
  .btnStop.Text  
  = 
    
  " 
  停止 
  " 
  ;
             
  this 
  .btnStop.Click  
  += 
    
  new 
   System.EventHandler( 
  this 
  .btnStop_Click);
             
  // 
   
             
  // 
   button1
             
  // 
    
  
 
               
  this 
  .button1.Location  
  = 
    
  new 
   System.Drawing.Point( 
  14 
  ,  
  97 
  );
             
  this 
  .button1.Name  
  = 
    
  " 
  button1 
  " 
  ;
             
  this 
  .button1.Size  
  = 
    
  new 
   System.Drawing.Size( 
  75 
  ,  
  23 
  );
             
  this 
  .button1.TabIndex  
  = 
    
  3 
  ;
             
  this 
  .button1.Text  
  = 
    
  " 
  关闭 
  " 
  ;
             
  this 
  .button1.Click  
  += 
    
  new 
   System.EventHandler( 
  this 
  .button1_Click);
             
  // 
   
             
  // 
   textBox1
             
  // 
    
  
 
               
  this 
  .textBox1.Location  
  = 
    
  new 
   System.Drawing.Point( 
  14 
  ,  
  11 
  );
             
  this 
  .textBox1.Name  
  = 
    
  " 
  textBox1 
  " 
  ;
             
  this 
  .textBox1.Size  
  = 
    
  new 
   System.Drawing.Size( 
  75 
  ,  
  21 
  );
             
  this 
  .textBox1.TabIndex  
  = 
    
  4 
  ;
             
  this 
  .textBox1.Text  
  = 
    
  " 
  200 
  " 
  ;
             
  // 
   
             
  // 
   lblResult
             
  // 
    
  
 
               
  this 
  .lblResult.AutoSize  
  = 
    
  true 
  ;
             
  this 
  .lblResult.Location  
  = 
    
  new 
   System.Drawing.Point( 
  12 
  ,  
  139 
  );
             
  this 
  .lblResult.Name  
  = 
    
  " 
  lblResult 
  " 
  ;
             
  this 
  .lblResult.Size  
  = 
    
  new 
   System.Drawing.Size( 
  23 
  ,  
  12 
  );
             
  this 
  .lblResult.TabIndex  
  = 
    
  5 
  ;
             
  this 
  .lblResult.Text  
  = 
    
  " 
  0/0 
  " 
  ;
             
  // 
   
             
  // 
   ThreadExample
             
  // 
    
  
 
               
  this 
  .AutoScaleDimensions  
  = 
    
  new 
   System.Drawing.SizeF(6F, 12F);
             
  this 
  .AutoScaleMode  
  = 
   System.Windows.Forms.AutoScaleMode.Font;
             
  this 
  .ClientSize  
  = 
    
  new 
   System.Drawing.Size( 
  104 
  ,  
  164 
  );
             
  this 
  .Controls.Add( 
  this 
  .lblResult);
             
  this 
  .Controls.Add( 
  this 
  .textBox1);
             
  this 
  .Controls.Add( 
  this 
  .button1);
             
  this 
  .Controls.Add( 
  this 
  .btnStop);
             
  this 
  .Controls.Add( 
  this 
  .btnStart);
             
  this 
  .Name  
  = 
    
  " 
  ThreadExample 
  " 
  ;
             
  this 
  .Text  
  = 
    
  " 
  Form1 
  " 
  ;
             
  this 
  .ResumeLayout( 
  false 
  );
             
  this 
  .PerformLayout();

        }

         
  #endregion 
  

         
  private 
   System.Windows.Forms.Button btnStart;
         
  private 
   System.Windows.Forms.Button btnStop;
         
  private 
   System.Windows.Forms.Button button1;
         
  private 
   System.Windows.Forms.TextBox textBox1;
         
  private 
   System.Windows.Forms.Label lblResult;
    }
}



程序代码:


using 
   System;
 
  using 
   System.Collections.Generic;
 
  using 
   System.ComponentModel;
 
  using 
   System.Data;
 
  using 
   System.Drawing;
 
  using 
   System.Text;
 
  using 
   System.Windows.Forms;
 
  using 
   System.Threading;

 
  namespace 
   ThreadExample
{
     
  public 
   partial  
  class 
   ThreadExample : Form
    {
         
  // 
  声明一个线程 
  
 
           
  private 
   Thread timerThread;
         
  // 
  声明一个变量,用来存储label值 
  
 
           
  int 
   count, i  
  = 
    
  0 
  ;

         
  public 
   ThreadExample()
        {
            InitializeComponent();
        }

         
  // 
  把label的值加1; 
  
 
           
  public 
    
  void 
   AddData()
        {
             
  // 
  显示lable的值 
  
 
               
  if 
   (i  
  == 
   count)
                i  
  = 
    
  0 
  ;
             
  this 
  .lblResult.Text  
  = 
   i.ToString()  
  + 
    
  " 
  / 
  " 
    
  + 
   count.ToString();
            i 
  ++ 
  ;
        }

         
  // 
  更新线程 
  
 
           
  public 
    
  void 
   UpdataThread()
        {
             
  try 
  
            {
                 
  // 
  在对控件的调用方法进行调用时,或需要一个简单委托又不想自己定义时可以使用该委托。 
  
 
                  MethodInvoker mi  
  = 
    
  new 
   MethodInvoker( 
  this 
  .AddData);
                 
  while 
   ( 
  true 
  )
                {
                     
  // 
  在创建控件的基础句柄所在线程上异步执行指定的委托 
  
 
                       
  this 
  .BeginInvoke(mi);
                    Thread.Sleep( 
  50 
  );
                }
            }
             
  catch 
   (ThreadInterruptedException)
            {
                 
  // 
  针对具体问题定制异常抛出显示 
  
 
              }
             
  finally 
  
            {
                 
  // 
  做一些处理 
  
 
              }
        }

         
  // 
  启动线程 
  
 
           
  public 
    
  void 
   StartThread()
        {
            StopThread();
            timerThread  
  = 
    
  new 
   Thread( 
  new 
   ThreadStart(UpdataThread));
             
  // 
  获取或设置一个值,该值指示某个线程是否为后台线程。 
  
 
              timerThread.IsBackground  
  = 
    
  true 
  ;
            timerThread.Start();
        }

         
  // 
  停止线程 
  
 
           
  public 
    
  void 
   StopThread()
        {
             
  if 
   (timerThread  
  != 
    
  null 
  )
            {
                 
  // 
  中断线程 
  
 
                  timerThread.Interrupt();
                timerThread  
  = 
    
  null 
  ;
            }
        }

         
  // 
  启动线程,显示结果 
  
 
           
  private 
    
  void 
   btnStart_Click( 
  object 
   sender, EventArgs e)
        {
             
  // 
  调用线程启动函数 
  
 
              count  
  = 
    
  int 
  .Parse(textBox1.Text);
             
  this 
  .StartThread();
        }

         
  // 
  停止线程 
  
 
           
  private 
    
  void 
   btnStop_Click( 
  object 
   sender, EventArgs e)
        {
             
  // 
  调用线程停止函数 
  
 
               
  this 
  .StopThread();
        }       
    }
}



编译后,运行,在文本框中输入200,点击开始按钮,标签为动态增长,点击停止可以暫停程序的执行。