C#多線程和線程池
1.0、線程的和進程的關係以及優缺點
windows系統是一個多線程的操做系統。一個程序至少有一個進程,一個進程至少有一個線程。進程是線程的容器,一個C#客戶端程序開始於一個單獨的線程,CLR(公共語言運行庫)爲該進程建立了一個線程,該線程稱爲主線程。例如當咱們建立一個C#控制檯程序,程序的入口是Main()函數,Main()函數是始於一個主線程的。它的功能主要 是產生新的線程和執行程序。C#是一門支持多線程的編程語言,經過Thread類建立子線程。
引入命名空間 using System.Threading。編程
多線程的優勢: windows
多線程的缺點:服務器
1.一、前臺線程和後臺線程
C#中的線程分爲前臺線程和後臺線程,線程建立時不作設置默認是前臺線程。即線程屬性IsBackground=false。
Thread.IsBackground = false;
1.二、區別以及如何使用:
這二者的區別就是:應用程序必須運行完全部的前臺線程才能夠退出;而對於後臺線程,應用程序則能夠不考慮其是否已經運行完畢而直接退出,全部的後臺線程在應用程序退出時都會自動結束。通常後臺線程用於處理時間較短的任務,如在一個Web服務器中能夠利用後臺線程來處理客戶端發過來的請求信息。而前臺線程通常用於處理須要長時間等待的任務,如在Web服務器中的監聽客戶端請求的程序。
1.三、多線程的建立
首先使用new Thread()建立出新的線程,而後調用Start方法使得線程進入就緒狀態,獲得系統資源後就執行,在執行過程當中可能有等待、休眠、死亡和阻塞四種狀態。正常執行結束時間片後返回到就緒狀態。若是調用Suspend方法會進入等待狀態,調用Sleep或者遇到進程同步使用的鎖機制而休眠等待。具體過程以下圖所示:多線程
System.Threading
System.Threading.Timer
System.Threading.Tasks編程語言
Thread th = new Thread(delegate ()
{
Response.Write("線程執行");
});
th.IsBackground = true;
th.Start();函數
或者操作系統
Thread th = new Thread(() =>
{
Response.Write("線程執行");
});pwa
th.IsBackground = true;
th.Start();線程
Task<string> task = Task.Factory.StartNew<string>(() =>
{
return "返回結果";
});
string result = task.Result;
或者對象
Task.Factory.StartNew(() =>
{
//用來計算運行時間
System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();
double ms = sw.ElapsedMilliseconds / 1000;
});
protected void Button1_Click(object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(WorkItem), null);
}
private void WorkItem(object obj)
{
TextBox1.Text = "執行完成";
}
子線程與主線程之間通訊
private SynchronizationContext synContext;
public MainWindow()
{
InitializeComponent();
//在這裏記錄主線程的上下文
synContext = SynchronizationContext.Current;
Task.Factory.StartNew(() =>
{
//用來計算運行時間
System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();
double ms = sw.ElapsedMilliseconds / 1000;
//通知主線程
synContext.Post(new SendOrPostCallback(OnConnected), null);
});
}
//因爲是主線程的同步對象Post調用,這個是在主線程中執行的
private void OnConnected(object state)
{
//這裏就回到了主線程裏面了
//作一些事情
}
兩個子線程的相互通訊
EventWaitHandle handleA = new AutoResetEvent(false);EventWaitHandle handleB = new AutoResetEvent(false);public 兩個子線程的相互通訊(){ InitializeComponent(); ThreadPool.QueueUserWorkItem(ar => { //發出信號並等待另外一個 EventWaitHandle.SignalAndWait(handleB, handleA); }); ThreadPool.QueueUserWorkItem(ar => { handleB.WaitOne(); EventWaitHandle.SignalAndWait(handleA, handleB); handleA.Set(); });}