程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#多線程進修之(二)把持一個線程的辦法

C#多線程進修之(二)把持一個線程的辦法

編輯:C#入門知識

C#多線程進修之(二)把持一個線程的辦法。本站提示廣大學習愛好者:(C#多線程進修之(二)把持一個線程的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C#多線程進修之(二)把持一個線程的辦法正文


本文實例講述了C#多線程進修之把持一個線程的辦法。分享給年夜家供年夜家參考。詳細完成辦法以下:

上面我們就著手來創立一個線程,應用Thread類創立線程時,只需供給線程進口便可。(線程進口使法式曉得該讓這個線程干甚麼事)

在C#中,線程進口是經由過程ThreadStart署理(delegate)來供給的,你可以把ThreadStart懂得為一個函數指針,指向線程要履行的函數,當挪用Thread.Start()辦法後,線程就開端履行ThreadStart所代表或許說指向的函數。

翻開你的VS.net,新建一個掌握台運用法式(Console Application),編寫完整掌握一個線程的代碼示例:

//ThreadTest.cs 
using System;
using System.Threading; 
namespace ThreadTest
{
public class Alpha
{
public void Beta()
{
while (true)
{
Console.WriteLine("Alpha.Beta is running in its own thread.");
}
}
}; 
public class Simple
{
public static int Main()
{
Console.WriteLine("Thread Start/Stop/Join Sample");
Alpha oAlpha = new Alpha();
file://這裡創立一個線程,使之履行Alpha類的Beta()辦法
Thread oThread = new Thread(new ThreadStart(oAlpha.Beta));
oThread.Start();
while (!oThread.IsAlive)
  Thread.Sleep(1);
oThread.Abort();
oThread.Join();
Console.WriteLine();
Console.WriteLine("Alpha.Beta has finished"); 
try 
{
Console.WriteLine("Try to restart the Alpha.Beta thread");
oThread.Start();
}
catch (ThreadStateException) 
{
Console.Write("ThreadStateException trying to restart Alpha.Beta. ");
Console.WriteLine("Expected since aborted threads cannot be restarted.");
Console.ReadLine();
}
return 0;
}
}
}

這段法式包括兩個類Alpha和Simple,在創立線程oThread時我們用指向 Alpha.Beta()辦法的初始化了ThreadStart署理(delegate)對象,當我們創立的線程oThread挪用 oThread.Start()辦法啟動時,現實上法式運轉的是Alpha.Beta()辦法:

Alpha oAlpha = new Alpha();
Thread oThread = new Thread(newThreadStart(oAlpha.Beta));
oThread.Start();

然後在Main()函數的while輪回中,我們應用靜態辦法Thread.Sleep()讓 主線程停了1ms,這段時光CPU轉向履行線程oThread。然後我們試圖用Thread.Abort()辦法終止線程oThread,留意前面的 oThread.Join(),Thread.Join()辦法使主線程期待,直到oThread線程停止。你可以給Thread.Join()辦法指定 一個int型的參數作為期待的最長時光。以後,我們試圖用Thread.Start()辦法從新啟動線程oThread,然則明顯Abort()辦法帶來 的效果是弗成恢復的終止線程,所以最初法式會拋出ThreadStateException異常。

主線程Main()函數

一切線程都是依靠於Main()函數地點的線程的,Main()函數是C#法式的進口,肇端線程可以稱之為主線程。
假如一切的前台線程都停滯了,那末主線程可以終止,而一切的後台線程都將無前提終止。
一切的線程固然在微不雅上是串行履行的,然則在微觀上你完整可以以為它們在並行履行。

Thread.ThreadState 屬性

這個屬性代表了線程運轉時狀況,在分歧的情形下有分歧的值,我們有時刻可以經由過程對該值的斷定來設計法式流程。
ThreadState 屬性的取值以下:
Aborted:線程已停滯;
AbortRequested:線程的Thread.Abort()辦法已被挪用,然則線程還未停滯;
Background:線程在後台履行,與屬性Thread.IsBackground有關;
Running:線程正在正常運轉;
Stopped:線程曾經被停滯;
StopRequested:線程正在被請求停滯;
Suspended:線程曾經被掛起(此狀況下,可以經由過程挪用Resume()辦法從新運轉);
SuspendRequested:線程正在請求被掛起,然則將來得及呼應;
Unstarted:未挪用Thread.Start()開端線程的運轉;
WaitSleepJoin:線程由於挪用了Wait(),Sleep()或Join()等辦法處於封閉狀況;

下面提到了Background狀況表現該線程在後台運轉,那末後台運轉的線程有甚麼特殊的處所呢?其實後台線程跟前台線程只要一個差別,那就是後 台線程無妨礙法式的終止。一旦一個過程一切的前台線程都終止後,CLR(通用說話運轉情況)將經由過程挪用隨意率性一個存活中的後台過程的Abort()辦法來徹 底終止過程。

線程的優先級

當線程之間爭取CPU時光時,CPU 是依照線程的優先級賜與辦事的。在C#運用法式中,用戶可以設定5個分歧的優先級,由高到低分離是Highest,AboveNormal,Normal,BelowNormal,Lowest,在創立線程時假如不指定優先級,那末體系默許為ThreadPriority.Normal。

給一個線程指定優先級,我們可使用以下代碼:

//設定優先級為最低
myThread.Priority=ThreadPriority.Lowest;

經由過程設定線程的優先級,我們可以支配一些絕對主要的線程優先履行,例如對用戶的呼應等等。

願望本文所述對年夜家的C#法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved