C# 進程 與 線程

C#多線程和線程池
1.0、線程的和進程的關係以及優缺點
windows系統是一個多線程的操做系統。一個程序至少有一個進程,一個進程至少有一個線程。進程是線程的容器,一個C#客戶端程序開始於一個單獨的線程,CLR(公共語言運行庫)爲該進程建立了一個線程,該線程稱爲主線程。例如當咱們建立一個C#控制檯程序,程序的入口是Main()函數,Main()函數是始於一個主線程的。它的功能主要 是產生新的線程和執行程序。C#是一門支持多線程的編程語言,經過Thread類建立子線程。
引入命名空間 using System.Threading。編程

多線程的優勢: windows

  1. 多線程能夠提升CPU的利用率,由於當一個線程處於等待狀態的時候,CPU會去執行另外的線程
  2. 提升了CPU的利用率,就能夠直接提升程序的總體執行速度


多線程的缺點:服務器

  1. 線程開的越多,內存佔用越大
  2. 協調和管理代碼的難度加大,須要CPU時間跟蹤線程
  3. 線程之間對資源的共享可能會產生可不遇知的問題

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();    });}

相關文章
相關標籤/搜索