前言:本來想根據自己的經驗總結一下c#線程相關的知識點, 寫之前看了一些其他人的博客,發現自己也就掌握了不到三分之一。。。。希望通過這次的博客將自己的知識點補充一下,寫出更直白的博客和初學者分享。
這是我參考的博客地址:http://www.cnblogs.com/miniwiki/archive/2010/06/18/1760540.html 。
這個是他參考的英文原著地址:http://www.albahari.com/threading/
原博客介紹的可以說深入淺出,鞭辟入裡。不過我想寫出更適合小白的,直接拿去就可以用到程序裡的博客。
一. 什麼是線程(知道下面幾點有助於了解)
1. 一個CPU同一時間只能做一件事,不過它處理信息太快了,甚至我們使用它的時候,把它分成了很多的時鐘周期(就是很短的時間間隔),再去把這些之間間隔分配個不同的應用,它也能很順暢的完成處理。就好像它能同時處理很多事一樣,我們根據這一點,就可以進行多線程,和多進程編程了。
2.進程是資源分配的基本單位。我們創建一個程序,默認是一個進程的,這個進程中包含了一個線程(主線程)。現在我們要在這個基礎上再去進行創建新的線程。(很多時候需要這樣)
3.進程中的線程,可以共享進程中的資源。
4.線程是系統獨立調度和分派CPU的基本單位指運行中的程序的調度單位。
二.為什麼要開啟新的線程
有很多時候主線程處理數據消耗太多時間,導致鼠標不能用,程序看起來卡住了。這時候,我們可以把消耗時間的事放到一個單獨的線程裡,讓主線程輕松起來。
三. 多線程的使用
1.目標
在主線程中開啟一個線程,線程傳回數據在主窗體中的文本框中顯示。

下面是所有的代碼,其中包括了代理 、Invoke、Lock,的使用。這個小的例子就可以幫助你開始使用線程了。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace 線程淺析
{
//創建SetValue的委托
public delegate void SetValueDel(string str,object obj);
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Thread.CurrentThread.Name = "MainThread";
}
//開啟一個線程
private void btnStart_Click(object sender, EventArgs e)
{
//將委托的方法和主窗體傳過去
NEWThreadClass threadOneClass = new NEWThreadClass(SetValue, this);
Thread TheThreadOne = new Thread(threadOneClass.threadOne);//不需要ThreadStart()也可以
TheThreadOne.Name = "TheThreadOne";//給線程命名,方便調試。這行代碼可以省略。
//讓線程變為後台線程(默認是前台的),這樣主線程結束了,這個線程也會結束。要不然,任何前台線程在運行都會保持程序存活。
TheThreadOne.IsBackground = true;
TheThreadOne.Start();
}
//給文本框賦值
private void SetValue(string str, object obj)
{
//lock裡面的代碼同一個時刻,只能被一個線程使用。其它的後面排隊。這樣防止數據混亂。
lock (obj)
{
this.txtReturnValue.Text = this.txtReturnValue.Text + str;
}
}
}
//建一個類,模擬實際使用情況
public class NEWThreadClass
{
//接收主窗體傳過來的委托方法。
public SetValueDel setValueDel;
//接收主窗體
public Form form;
//用於告訴主線程中鎖,是哪一個線程調用的。
static object locker = new object();
public NEWThreadClass(SetValueDel del ,Form fom)
{
this.setValueDel = del;
this.form = fom;
}
//第一個線程,給主線程創建的控件傳值。
public void threadOne()
{
//這裡獲取線程的名字
string threadName = Thread.CurrentThread.Name;
try
{
while (true)
{
//告訴主線程,我要更改你的控件了。
this.form.Invoke((EventHandler)(delegate
{
//如果在這裡使用Thread.CurrentThread.Name 獲取到的是主線程的名字。
setValueDel(threadName + " :Hello!", locker);//給文本框傳值,“自己的名字:Hello!”。
}));
Thread.Sleep(3 * 1000);//太累了 ,休息三秒。。。。
}
}
catch (Exception ex)
{ }
}
}
}