一. Sleep()阻塞線程休息方法的使用情況:
Thread.Sleep()方法用于使目前線程暫停指定的時間,然後去執行流程語句。
// 參數:
// millisecondsTimeout:
// 線程被阻塞的毫秒數。 指定零 (0) 以訓示應挂起此線程以使其他等待線程能夠執行。 指定 System.Threading.Timeout.Infinite
// 以無限期阻止線程。
//
public static void Sleep(int millisecondsTimeout);
// 參數:
// timeout:
// 設定為線程被阻塞的時間量的 System.TimeSpan。 指定零以訓示應挂起此線程以使其他等待線程能夠執行。 指定 System.Threading.Timeout.Infinite
// 以無限期阻止線程。
public static void Sleep(TimeSpan timeout);
常用于需要開啟一個不停執行某個超做,進行循環時候,需要對Thread進行阻塞,減少計算機資源的消耗,和合理的控制程式邏輯的執行。
private static Thread subthread ;
static void Main(string[] args)
{
Thread.CurrentThread.Name = "Main線程";
subthread = new Thread(new ThreadStart(GetShow)); //無參數的入口方法線程
subthread.Start(); //開啟線程
subthread.Name = "無參數的入口方法線程";
Console.WriteLine("主線程結束");
}
static void GetShow()
{
while (true)
{
Console.WriteLine(Thread.CurrentThread);
Console.WriteLine("進行資料同步");
Thread.Sleep(10000);//阻塞10000進行一次資料的同步
}
}
二. Interrupt() 喚醒休眠中的線程的方法
class Program
{
private static Thread subthread ;
static void Main(string[] args)
{
Thread.CurrentThread.Name = "Main線程";
subthread = new Thread(new ThreadStart(GetShow)); //無參數的入口方法線程
subthread.Name = "無參數的入口方法線程";
subthread.Start(); //開啟線程
for (int i = 1; i <= 5; i++)
{
Thread.Sleep(1000);
Console.WriteLine("第{0}秒",i);
}
subthread.Interrupt();
Console.WriteLine("主線程結束");
}
static void GetShow()
{
Console.WriteLine("名稱"+Thread.CurrentThread.Name);
try
{
Console.WriteLine("休息十秒");
Thread.Sleep(10000);
}
catch (Exception ex)
{
Console.WriteLine("線程被喚醒,隻休息了5秒");
Console.WriteLine(ex.Message);
}
Console.WriteLine(Thread.CurrentThread.Name);
}
}
注意:
線程在休眠的那一刻,被喚醒時,Thread.Sleep()方法會抛出異常,所有要用 try { }catch (Exception ex){ }包起來;
線程在沒有休眠的那一刻被喚醒,在後面某一端時間休眠後Thread.Sleep()方法會抛出異常,所有進行 try { }catch (Exception ex){ }異常處理,避免程式死掉。