一、簡單的例子
using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.linq;
using system.text;
using system.windows.forms;
using system.threading;
namespace multithreading
private void form1_load(object sender, eventargs e)
private void crossthreadflush()
}private void threadfuntion(string time)
);//呼叫**
}else
}///
/// 帶引數的啟動方法
///
/// 讓執行緒在執行過程中的休眠間隔
public void parameterrun(object ms)}}
2、控制多個控制項的方法:
using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.linq;
using system.text;
using system.windows.forms;
using system.threading;
namespace multithreading
private void form1_load(object sender, eventargs e)
/*private void crossthreadflush()
}private void threadfuntion(string time)
);//呼叫**
}else
}/// /// 帶引數的啟動方法
///
/// 讓執行緒在執行過程中的休眠間隔
public void parameterrun(object ms)
} */
private void crossthreadflush()
private void threadfunction()}}
}
二、多執行緒程式設計的幾種方式
1不帶引數的啟動方式
using system;using system.collections.generic;
using system.text;
using system.threading;
namespace startthread
///
/// 不帶引數的啟動方法
///
public void nonparameterrun()}}
2帶引數的啟動方法
如果要在例項化執行緒時要帶一些引數,就不能用threadstart委託作為建構函式的引數來例項化thread了,而要parameterizedthreadstart委託,和threadstart一樣的是它也是執行緒啟動時要執行的方法,和threadstart不同的是,它在例項化時可以用乙個帶有乙個object引數的方法作為建構函式的引數,而例項化threadstart時所用到的方法是沒有引數的。
為什麼是object這樣的引數呢?很簡單,因為在.net中object是所有型別的基類,用它可以表示array(陣列)、inte***ce(介面)、valuetype(值型別,如bool,byte,char,short,int,float,long,double等)、class(類)等.net中的型別。當然,這也意味著如果你要啟動乙個執行緒,給它傳遞乙個int型別引數時,必須在啟動方法中進行相應的型別轉換。
using system;
using system.collections.generic;
using system.text;
using system.threading;
namespace startthread
///
/// 帶引數的啟動方法
///
/// 讓執行緒在執行過程中的休眠間隔
public void parameterrun(object ms)}}
}在這個方法裡,我們在啟動執行緒時順便指定了執行緒的暫停間隔,也就是這句:
parameterthread.start(30);
執行緒啟動時執行的方法是public void parameterrun(object ms),這個值為30的int型別變數被裝箱成object,所以在方法中還需要將它轉換成int型別,這個可以通過拆箱或者其它辦法解決。
假如我們要啟動兩個執行緒,每個執行緒的暫停間隔不一樣,啟動**如下:
using system;
using system.collections.generic;
using system.text;
using system.threading;
namespace startthread
///
/// 帶引數的啟動方法
///
/// 讓執行緒在執行過程中的休眠間隔
public void parameterrun(object ms)}}
} 對上面的**做一點說明,
就是執行緒啟動之後,執行緒的例項不必再存在
,例如在上面的**中我用的是同乙個例項例項化了兩個執行緒,並且這兩個執行緒執行很正常。
繼續探索
上面解決了乙個問題,如果在啟動執行緒時需要引數如何解決,如果針對上面的問題繼續發掘,比如:在啟動執行緒時不但要指定執行緒的暫停間隔,還需要指定迴圈次數(在上面的所有例子中都是執行10次的),這個問題該如何解決呢?
有兩種辦法可以解決:
這裡說說重新定義乙個實體類來解決的方法,**如下。
using system;
using system.collections.generic;
using system.text;
using system.threading;
namespace startthread
}///
/// 執行緒的暫停間隔
///
public int interval
}///
/// 建構函式
///
/// 執行緒的暫停間隔
/// 迴圈次數
public mythreadparameter(int interval,int loopcount)
}class program
///
/// 帶多個引數的啟動方法
///
/// 方法引數
public void myparameterrun(object ms)}}
}}如果實現上面的效果,**如下:
using system;
using system.collections.generic;
using system.text;
using system.threading;
namespace startthread
public void start()
}private void run()}}
class program}}
上面的**的執行效果和前面的**執行效果類似,只不過是將業務處理**放在乙個單獨的類mythreadparameter中,使得mythreadparameter看起來也像乙個thread,實際上維護的還是其內部的thread,在一些大型系統中這樣做的好處是便於維護。
總結:在本篇主要講述如何啟動執行緒的問題,在啟動時可能會遇到無需引數、需要多個引數的情況,在這裡講述了如何解決這些問題的思路。在.net類庫中雖然存在著龐大的類庫,但是並不是總會有合適的類來解決我們所遇到的問題,但是只要肯動腦筋總會想到合適的辦法。
C 多執行緒程式設計
一 thread 基礎 程序 當乙個程式開始執行時,它就是乙個程序,程序包括執行中的程式和程式所使用到的記憶體和系統資源。而乙個程序又是由多個執行緒所組成的。執行緒 執行緒是程式中的乙個執行流,每個執行緒都有自己的專有暫存器 棧指標 程式計數器等 但 區是共享的,即不同的執行緒可以執行同樣的函式 方...
C 多執行緒程式設計
乙個程序通常定義為程式的乙個例項。在win32中,程序佔據4gb的位址空間。與它們在ms dos和16位windows作業系統中不同,win32程序是沒有活力的。這就是說,乙個win32程序並不執行什麼指令,它只是佔據著4gb的位址空間,此空間中有應用程式exe檔案的 和資料。exe需要的任意dll...
C 多執行緒程式設計
建立執行緒的函式 handle createthread lpsecurity attributes lpthreadattributes,使用預設安全形態,設為null,表明不可被子執行緒繼承 size t dwstacksize,初始棧大小,預設值0表示使用與呼叫該函式的執行緒相同的棧大小 lp...