1. 引言
先來個比喻手法:
如果把上課的過程比作進程,那麼每個學生就是一個線程,他們共用教室,即線程共用進程的記憶體空間。每一個時刻,只能一個學生問老師問題,老師回答完畢,輪到下一個。即線程在一個時間片內佔有cpu。
這個例子容易理解多了吧?!下面馬上來看些基本概念。僅為個人理解,輕描淡寫。
2. 進程
進程是表示資源分派的基本單位,又是調度啟動並執行基本單位。從編程的角度,也可以將進程看成一塊包含了某些資源的記憶體地區。
例如:當使用者開啟一個txt文檔時,系統就建立一個進程,並為它分配資源。有時候開啟得很慢,這是因為此時CPU啟動並執行進程數過多,該進程需要等待調度,才能真正運行。如果再開啟另外一個txt文檔時,此時在資源管理員中會發現有兩個進程,所佔的記憶體數不一樣,是因為文檔的大小不相同。
所以我的理解是,只要是開啟應用程式,就會建立進程。
在.NET架構在System.Diagnostics名稱空間中,有一個類Process,可以用來建立一個新的進程。下面用代碼來建立一個Hello.txt的記事本,運行代碼後啟動工作管理員,可以發現建立了一個記事本的進程。
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Threading;
namespace ProcessPgr
{
class Program
{
static void Main(string[] args)
{
Process process = Process.Start("notepad.exe", "Hello.txt");//建立Hello.txt的記事本
Thread.Sleep(1000);
Console.ReadLine();
process.Kill();
}
}
}
3.線程
線程是進程中執行運算的最小單位,也是執行處理機調度的基本單位。實際上線程是輕量級的進程。那麼為什麼要使用線程呢?
(1)易於調度。 (2)提高並發性。通過線程可方便有效地實現並發性。進程可建立多個線程來執行同一程式的不同部分。 (3)開銷少。建立線程比建立進程要快,所需開銷很少。。 (4)利於充分發揮多處理器的功能。通過建立多線程進程(即一個進程可具有兩個或更多個線程),每個線程在一個處理器上運行,從而實現應用程式的並發性,使每個處理器都得到充分運行。 進程和線程的關係 (1)一個線程只能屬於一個進程,而一個進程可以有多個線程,但至少有一個線程。 (2)資源分派給進程,同一進程的所有線程共用該進程的所有資源。 (3)處理機分給線程,即真正在處理機上啟動並執行是線程。 (4)線程在執行過程中,需要協作同步。不同進程的線程間要利用訊息通訊的辦法實現同步。
例如我們建立一個winform表單時,建立一個線程,將內容賦值給文字框,點擊擷取資料。此時如果直接在委託方法裡面操作會報異常,因為建立的線程不能訪問UI控制項,所以我們在擷取資料的時候,通過Invoke或者BeginInvoke去非同步呼叫。
解決方案:
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 WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Thread thread;
public delegate void MyInvoke();
private void btnSend_Click_1(object sender, EventArgs e)
{
labMessage.Text = "正在讀取資料,請等待";
thread = new Thread(Send);
thread.IsBackground = true;
thread.Start();
}
protected void Send()
{
MyInvoke invoke = new MyInvoke(Get);
this.BeginInvoke(invoke);
}
protected void Get()
{
Thread.Sleep(3000);
txtName.Text = "TerryChan";
txtNum.Text = "07";
txtGrade.Text = "軟體工程";
}
}
}
效果:
最後總結:進程和線程的知識點不是簡單一兩句話就能說清楚,自己只是稍微有個大概瞭解,學習之路任重而道遠。
作者: ForEvErNoME
出處: http://www.cnblogs.com/ForEvErNoME/
歡迎轉載或分享,但請務必聲明文章出處。如果文章對您有協助,希望你能 推薦 或 關注