分享

C# 多线程实例

 goodwangLib 2014-03-23

线程的创建

       线程是使用Thread 类来处理的,包含在System.Threading 中。通过实例化一个Thread对象来创建一个线程。Thread类接受一

  1. Thread t=new Thread(new ThreadStart(TestMethod));  
  2. t.Start();  


个ThreadStart委托,或ParameterizedThreadStart委托的构造函数,

  1. Thead th = new Thread(new ParameterizedThreadStart(TestMethod));  
  2. th.Start();  

Thread 类常用属性

1 IsAlive 获取一个只,该值指示当前线程的执行状态

2 Priority 获取或设置,线程优先级

3 IsBackgroud 获取或设置,是否为后台线程

4 CurrentThread 获取当前正在运行的线程

常用方法

Abort() :终止线程

Start() 开始线程

例子

下面的例子可以体现出线程的意义,写了一个窗体,每隔0.5秒刷新一下label中的值,从1 一直加下去

  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;//调用多线程要using这个~  
  10.   
  11. namespace WindowsFormsApplication1  
  12. {  
  13.     public partial class Form1 : Form  
  14.     {  
  15.         Thread _thread = null;//定义线程  
  16.         delegate void SetLabelText(string str);//定义委托,用来完成线程的赋值  
  17.   
  18.         public Form1()  
  19.         {  
  20.             InitializeComponent();  
  21.         }  
  22.         /// <summary>  
  23.         /// 作为线程,不断地变换label中的值  
  24.         /// </summary>  
  25.         private void setNum()  
  26.         {  
  27.             for (int i = 1; i < 100; ++i)  
  28.             {  
  29.                 //这么调用会失败,产生错误“线程间操作无效”  
  30.                 //this.label1.Text = i.ToString();  
  31.   
  32.                 //需要用委托调用  
  33.                 SetLabelText st = new SetLabelText(setLabel);  
  34.                 //用invoke 方法来达到线程间操作的目的  
  35.                 this.Invoke(st, i.ToString());  
  36.                 Thread.Sleep(500);  
  37.             }  
  38.         }  
  39.         /// <summary>  
  40.         /// 加载窗体,开始线程  
  41.         /// </summary>  
  42.         /// <param name="sender"></param>  
  43.         /// <param name="e"></param>  
  44.         private void Form1_Load(object sender, EventArgs e)  
  45.         {  
  46.             _thread = new Thread(new ThreadStart(setNum));  
  47.             _thread.Start();  
  48.         }  
  49.   
  50.         /// <summary>  
  51.         /// 窗体关闭,要结束线程  
  52.         /// </summary>  
  53.         /// <param name="sender"></param>  
  54.         /// <param name="e"></param>  
  55.         private void Form1_FormClosed(object sender, FormClosedEventArgs e)  
  56.         {  
  57.             if (_thread.IsAlive)  
  58.             {  
  59.                     _thread.Abort();  
  60.   
  61.             }  
  62.         }  
  63.         /// <summary>  
  64.         /// 为label 赋值  
  65.         /// </summary>  
  66.         /// <param name="str"></param>  
  67.         private void setLabel(string str)  
  68.         {  
  69.             this.label1.Text = str;  
  70.         }  
  71.     }  
  72. }  



 要注意的是线程间的操作时需要调用委托的,上面的例子如果setNum这样写就会出错

  1. private void setNum()  
  2.   {  
  3.       for (int i = 1; i < 100; ++i)  
  4.       {  
  5.           //这么调用会失败,产生错误“线程间操作无效”  
  6.           this.label1.Text = i.ToString();  
  7.   
  8.           //需要用委托调用  
  9.           //SetLabelText st = new SetLabelText(setLabel);  
  10.           //用invoke 方法来达到线程间操作的目的  
  11.          // this.Invoke(st, i.ToString());  
  12.           Thread.Sleep(500);  
  13.       }  
  14.   }  


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多