C#裡面建立多線程,使用“Thread”類。假設Do方法有一個string參數,那麼就要使用“ParameterizedThreadStart”進行執行個體化,詳細如下。
Thread th = new Thread(new ParameterizedThreadStart(Do)); th.IsBackground=true; th.Start(your value here);
看這句代碼,如果 Do 方法執行完成,該線程就自動銷毀了。如果該線程不是後台線程,應用程式定義域退出時,它也會自動結束。當然,還有其它的方式用意強制結束線程,但是這些方法
都和你的 Do 方法要執行任務相關,有時候會造成你顯式的調用了 Abort,但是它仍在運行。通常會在Do方法內把任務分解的足夠細,然後通過 ManualResetEvent 來控制線程的退出。
要在應用程式退出時銷毀可以,這要看你是什麼應用程式,如果是WinForm,你只要執行下面語句:
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
try
{
if(this.thread != null)
{
this.thread.Suspend();
this.thread.Abort();
}
}
catch
{
MessageBox.Show("異常終止線程");
}
}
其實,只要線程的宿主進程銷毀了,線程就會自動銷毀。
可以把多個線程放入一個Dictionary中,Dictionary<string,Thread>,其中string為“標識”(可以通過Name擷取)。
可以通過Start,Suspend或者Reset方法控制啟停(注意,這些方法對於同步而言是過時的,但單純對於控制線程”停止“和”啟動“是可以的)。
namespace Processing
{
public class ETLProcess
{
public Dictionary<string,Thread> threadlists;//線程列表
public ETLProcess()
{
threadlists = new Dictionary<string, Thread>();
}
public bool CreateThead(string ETLTableName)
{
bool flag=false;
//TableName = ETLTableName;
try
{
Thread th = new Thread(new ParameterizedThreadStart(Do));
th.IsBackground = true;
th.Name = ETLTableName;
th.Start(ETLTableName);
threadlists.Add(ETLTableName, th);
flag = true;
}
catch (Exception ex)
{
flag = false;
}
return flag;
}
public void Do(object TableName)
{
while (true)
{
Processing(TableName.ToString());
//Thread.Sleep(60000);//線程一分鐘跑一次
Thread.Sleep(10000);
}
}
public bool SuspendThread(string threadname)
{
bool flag = false;
try
{
threadlists[threadname].Suspend();
flag = true;
}
catch (Exception ex)
{
flag = false;
}
return flag;
}
public bool SuspendAbort(string threadname)
{
bool flag = false;
try
{
threadlists[threadname].Abort();
flag = true;
}
catch (Exception ex)
{
flag = false;
}
return flag;
}
}
}
最後,要注意線程最外圍要用“While”保證線程的持續運行。如果是多線程訪問資料庫,注意線程間“資料庫連接資源Conn”對象的競爭。