在博文《C#多線程開發1:使用Thread類創建與啟動線程》中介紹了線程的創建與啟動。本文將在前文的基礎之上,接著介紹線程的掛起,恢復與中止等操作。
首先回憶一下前文的知識點。
我們已經學習到:
1、創建線程
[csharp]
ThreadStart entry = new ThreadStart(CalcSum);
Thread workThread = new Thread(entry);
或者
[csharp]
Thread workThread = new Thread(new ThreadStart(CalcSum));
線程入口方法:
[csharp]
static void CalcSum()
{
//do what you want
}
2、啟動線程
[csharp]
workThread.Start();
接下來,我們來研究線程的其他操作。
此文所用實例是在前文實例的基礎上做一點小變動而得到的。
一開始,給出前文的完整實例代碼及運行結果(以供整體把握實例操作)。
[csharp]
using System;
using System.Threading;
namespace ThreadExample
{
class Program
{
static void Main(string[] args)
{
ThreadStart entry = new ThreadStart(CalcSum);
Thread workThread = new Thread(entry);
workThread.Start();
CalcGap();
}
static void CalcSum()
{
long sum = 0;
for (long i = 0; i < 1000000000; i++)
{
sum += i;
if (i % 100000000 == 0 && i!=0)
{
Console.WriteLine("workThread-->i={0}:sum={1}",i,sum);
}
}
}
static void CalcGap()
{
long gap = 0;
for (long i = 1000000000; i >=0 ; i--)
{
gap = i-1;
if (i % 100000000 == 0 && i != 0)
{
Console.WriteLine("MainThread-->i={0}:gap={1}", i, gap);
}
}
}
}
}
運行結果:
實例中,存在兩個線程,主線程(Main函數)和工作線程(workThread線程),主線程完成求差操作,工作線程完成求和操作。兩個線程同時運行。
3、掛起線程
掛起線程使用Suspend()方法。
線程被掛起後,操作被停止或進入休眠狀態。
被掛起的線程不占用任何處理器時間。
修改前文實例代碼,修改部分如下:
[csharp]
ThreadStart entry = new ThreadStart(CalcSum);
Thread workThread = new Thread(entry);
workThread.Start();
workThread.Suspend();//掛起線程(改動部分)
CalcGap();
再次執行程序,得到如下結果:
從結果中可以看出,此時主線程正常執行,但是工作線程workThread沒有被執行,因為工作線程一啟動後就被掛起了,所以不會被執行。那麼要想工作線程能繼續執行,就需要恢復線程了。
4、恢復線程
線程恢復使用Resume()方法。
再次修改代碼。
[csharp]
Thread workThread = new Thread(new ThreadStart(CalcSum));
workThread.Start();
workThread.Suspend();//掛起線程(改動部分)
CalcGap();
workThread.Resume();//恢復線程(改動部分)
上面的代碼,在主線程執行完後,恢復被掛起的工作線程,執行結果如下。
對於這個結果,我們是可以預見的。