C# 進程 與 線程


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

多線程的優點:

  1. 多線程可以提高CPU的利用率,因為當一個線程處於等待狀態的時候,CPU會去執行另外的線程
  2. 提高了CPU的利用率,就可以直接提高程序的整體執行速度


多線程的缺點:

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

1.1、前台線程和后台線程
C#中的線程分為前台線程和后台線程,線程創建時不做設置默認是前台線程。即線程屬性IsBackground=false。
Thread.IsBackground = false;

1.2、區別以及如何使用:
這兩者的區別就是:應用程序必須運行完所有的前台線程才可以退出;而對於后台線程,應用程序則可以不考慮其是否已經運行完畢而直接退出,所有的后台線程在應用程序退出時都會自動結束。一般后台線程用於處理時間較短的任務,如在一個Web服務器中可以利用后台線程來處理客戶端發過來的請求信息。而前台線程一般用於處理需要長時間等待的任務,如在Web服務器中的監聽客戶端請求的程序。

1.3、多線程的創建
首先使用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("線程執行");
});

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM