锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鍦ㄥ緢澶氱敤C++寮鍙戞湇鍔″櫒浜у搧鏃訛紝闇瑕佸皢涓嶅悓鐨勬暟鎹被鍨嬪瓨鍌ㄥ埌涓涓鍣ㄤ腑(鏈夌偣綾諱技HttpSession鍙互淇濆瓨浼?xì)璇濇湡闂翠焕L剰綾誨瀷鐨勬暟鎹?錛屼緵鍏跺畠浣跨敤紼嬪簭鏌ユ壘銆?br> 鍦↗ava鍜孋#涓繖鏄竴涓畝鍗曠殑闂錛屽彲浠ヤ嬌鐢∣bject瀵硅薄鏉ュ疄鐜扮被鍨嬫棤鍏崇殑鏁版嵁緇撴瀯錛屽茍涓斿緢濂界殑瑙e喅浜?jiǎn)鍐呭瓨鍥炴敹绛夐棶棰樸?br> 浣咰++涓緢闅懼仛鍒拌繖涓鐐癸紝C++鏄竴闂ㄩ潤(rùn)鎬佺被鍨嬭璦錛屾病鏈変竴涓墍鏈夌被鍨嬬殑鍩虹被銆?/p>
2.涓鑸柟娉?/strong>
涓鑸В鍐寵繖涓棶棰樼殑鍔炴硶鏄嬌鐢╲oid*鎸囬拡鏉ュ瓨鍌ㄦ暟鎹紝璞′笅闈㈢殑浠g爜錛?br> map<string,void*>
浣嗘槸榪欐牱甯︽潵鍑犱釜闂錛?br> 錛?錛夊洜涓篊++鍦ㄤ笉鐭ラ亾綾葷被鍨嬫椂鏃犳硶姝g‘鐨勯噴鏀懼唴瀛橈紱
錛?錛夊緢澶氫嬌鐢ㄨ呬嬌鐢ㄥ畠鏃訛紝閲婃斁鍐呭瓨鐨勬椂鏈洪毦浜庣‘瀹氾紱
3.璁╁畠姝g‘閲婃斁鍐呭瓨
鎴戜滑鍙互瀹氫箟涓涓叕鍏辯殑鍩虹被錛岃鎵鏈夐渶瑕佹斁鍒板鍣ㄧ殑綾誨瀷緇ф壙瀹?br> class Object
{
public:
virtual ~Object(){cout<<"Object Destroy" << endl;}
};
鐢變簬浣跨敤浜?jiǎn)virtual鏋愭瀯鍑芥暟鍥犳鍙互紜繚delete obj鐨勬椂鍙互姝e父宸ヤ綔銆傚洜姝や笂闈㈢殑瀹瑰櫒瀹氫箟鍙樻垚浜?jiǎn)杩欐狓P細(xì)
map<string,Object*>
4.璁╁畠鐭ラ亾浣曟椂閲婃斁鍐呭瓨
澶у閮界煡閬擄紝榪欐椂蹇呴』浣跨敤寮曠敤璁℃暟錛屼笉榪囧緢騫歌繍鏈夌幇鎴愮殑錛屾垜浠嬌鐢╞oost::share_ptr
map<string,boost::share_ptr<Object*> >
寰堝ソ涓や釜闂閮藉凡緇忚В鍐籌紝浣嗗浣曞悜浠栦滑涓姞鍏++鐨勫熀鏈被鍨嬪憿錛?/p>
5.寮鍙戝熀鏈被鍨嬬殑灝佽綾?/strong>
鍩烘湰綾誨瀷寰堝錛屽鏋滄瘡涓涓兘鍐欎竴涓被錛屽お绱簡(jiǎn)錛屾垜浠彲浠ュ畾涔変竴涓ā鏉匡紝榪欓噷鐨勯毦鐐規(guī)槸鍩烘湰綾誨瀷涔嬮棿鐨勬搷浣滅閲嶈澆錛屼笉鍚岀被鍨嬩箣闂寸殑榪愮畻榪斿洖鐨勭被鍨嬪茍涓嶇浉鍚岋紝榪欏氨闇瑕佸啓寰堝閲嶈澆鍑芥暟錛屽湪榪欓噷鎴戜滑浣跨敤Loki鏉ョ畝鍖栬繖浜涙搷浣溿備嬌鐢↙oki鐨凾ypeList鏉ヨ嚜鍔ㄨ綆楀簲璇ユ槸浠涔堣繑鍥炲?br> #include"Typelist.h" //Loki澶存枃浠?br> template <typename T>
class PrimerType:public Object
{
public:
typedef T value_type;//鍩烘湰綾誨瀷
typedef PrimerType<T> class_type;//鍩烘湰綾誨瀷鐨勫璞$被鍨?br>
public:
PrimerType()
:m_value((value_type)0)
{
}
template<typename Other>
PrimerType(const Other& value)
:m_value(value)
{
}
~PrimerType()
{
cout<<"PrimerType Destroy" << endl;
}
//鍩烘湰綾誨瀷杞崲鎿嶄綔絎﹂噸杞?br> operator value_type() const
{
return m_value;
}
//璧嬪兼搷浣滅閲嶈澆
const class_type& operator=(value_type value)
{
m_value=value;
return *this;
}
bool operator!( ) const
{
return !m_value;
}
//浣滀負(fù)綾繪垚鍛樼殑綆楁湳榪愮畻絎︽搷浣滅閲嶈澆
class_type& operator++()
{// ++ 鍓嶇紑
m_value+=1;
return *this;
}
const class_type operator++(int)
{// ++ 鍚庣紑
class_type oldValue=*this;
m_value+=1;
return oldValue;
}
class_type& operator--()
{// -- 鍓嶇紑
m_value-=1;
return *this;
}
const class_type operator--(int)
{// -- 鍚庣紑
class_type oldValue=*this;
m_value-=1;
return oldValue;
}
class_type& operator+=(const value_type& value)
{
m_value+=value;
return *this;
}
//銆傘傘傜渷鐣?= /= *= &= |= ^= %= 絳夌瓑
private:
value_type m_value;
friend istream& operator>><T> ( istream& is, class_type& ptvalue );
};
//嫻佽緭鍏ュ嚱鏁幫紝涓嶇敤杈撳嚭錛堥氳繃綾誨瀷鎿嶄綔絎﹂噸杞借嚜鍔ㄥ畬鎴愶級(jí)
template<typename T>
istream& operator>> ( istream& is, PrimerType<T>& ptvalue )
{
is >> ptvalue.m_value;
return is;
}
//鍩烘湰綾誨瀷閲嶅畾涔?br> typedef __int8 int8;
typedef __int16 int16;
typedef __int32 int32;
typedef __int64 int64;
typedef unsigned __int8 uint8;
typedef unsigned __int16 uint16;
typedef unsigned __int32 uint32;
typedef unsigned __int64 uint64;
//鍩烘湰綾誨瀷鐨勫璞$被鍨?br> typedef PrimerType<bool> Boolean;
typedef PrimerType<int8> Int8;
typedef PrimerType<int16> Int16;
typedef PrimerType<int32> Int32;
typedef PrimerType<int64> Int64;
typedef PrimerType<uint8> UInt8;
typedef PrimerType<uint16> UInt16;
typedef PrimerType<uint32> UInt32;
typedef PrimerType<uint64> UInt64;
typedef PrimerType<float> Float;
typedef PrimerType<double> Double;
typedef PrimerType<long> Long;
typedef PrimerType<unsigned long> ULong;
//鏇村弸濂界殑鍚嶅瓧
typedef Int8 Char;
typedef Int16 Short;
typedef Int32 Int;
typedef UInt8 Byte;
typedef UInt16 UShort;
typedef UInt32 UInt;
//綆楁湳榪愮畻榪斿洖綾誨瀷鐨則raits錛岃繍綆楁椂浠ユ帓鍦ㄥ悗闈㈢殑綾誨瀷榪斿洖
#define PRIMERTYPELIST TYPELIST_13(bool,int8,uint8,int16,uint16,int32,uint32,long,unsigned long,int64,uint64,float,double)
// |
// int
template <typename T1, typename T2>
struct ResultType_Traits
{
enum { lefttype_index =::Loki::TL::IndexOf<PRIMERTYPELIST,T1>::value};
enum { righttype_index =::Loki::TL::IndexOf<PRIMERTYPELIST,T2>::value};
enum { resulttype_index = (lefttype_index>righttype_index)?lefttype_index:righttype_index};
typedef typename ::Loki::TL::TypeAt<PRIMERTYPELIST, (resulttype_index<5)?5:resulttype_index >::Result result_type;
};
//浣滀負(fù)鍏ㄥ眬鐨勭畻鏈繍綆楃鎿嶄綔絎﹂噸杞?+ - * /
template<typename T1,typename T2>
typename ResultType_Traits<T1,T2>::result_type operator +(const PrimerType<T1>& lhs,const T2& rhs)
{
return (T1)lhs+rhs;
}
template<typename T1,typename T2>
typename ResultType_Traits<T1,T2>::result_type operator +(const T1& lhs,const PrimerType<T2>& rhs)
{
return lhs+(T2)rhs;
}
template<typename T1,typename T2>
typename ResultType_Traits<T1,T2>::result_type operator +(const PrimerType<T1>& lhs,const PrimerType<T2>& rhs)
{
return (T1)lhs+(T2)rhs;
}
//銆傘傘傜渷鐣?- * /絳夌瓑
// 閫昏緫榪愮畻絎﹂噸杞?br> template<typename T1,typename T2>
bool operator ==(const PrimerType<T1>& lhs,const T2& rhs)
{
return (T1)lhs==rhs;
}
template<typename T1,typename T2>
bool operator ==(const T1& lhs,const PrimerType<T2>& rhs)
{
return lhs==(T2)rhs;
}
template<typename T1,typename T2>
bool operator ==(const PrimerType<T1>& lhs,const PrimerType<T2>& rhs)
{
return (T1)lhs==(T2)rhs;
}
//銆傘傘傜渷鐣?!= >= 絳夌瓑
6.灝忕粨
浣跨敤瀵硅薄鏉ヨ〃紺哄熀鏈被鍨嬶紝鐢變簬浣跨敤浜?jiǎn)virtual鐨勬瀽鏋勫畠鏄湁鍐呭瓨?gòu)躬璐圭殑锛屼絾鍦ㄥ緢澶氬簲鐢ㄤ腑瀹冩槸寰堟湁鐢ㄧ殑銆?br> 鍚屾椂浣犲彲浠ュ鍔燬tring/DateTime鐨勭壒鍖栨敮鎸侊紝榪欐牱灝卞畬鏁翠簡(jiǎn)
]]>
public
void ThreadProc();
Thread thread = new Thread( new ThreadStart( ThreadProc ) );
thread.IsBackground = true;
thread.Start();
浣嗘槸寰堝鏃跺欙紝鍦ㄦ柊鐨勭嚎紼嬩腑錛屾垜浠渶瑕佷笌 UI 榪涜浜や簰錛屽湪 .net 涓笉鍏佽鎴戜滑鐩存帴榪欐牱鍋氥傚彲浠ュ弬鑰?/span> MSDN 涓殑鎻忚堪錛?/span>
鈥淲indows
紿椾綋鈥?/span>浣跨敤鍗曠嚎紼嬪崟鍏?span lang="EN-US"> (STA) 妯″瀷錛屽洜涓?span lang="EN-US">鈥淲indows 紿椾綋鈥?/span>鍩轟簬鏈満 Win32 紿楀彛錛岃?span lang="EN-US"> Win32 紿楀彛浠庢湰璐ㄤ笂鑰岃█鏄崟鍏冪嚎紼嬨?span lang="EN-US">STA 妯″瀷鎰忓懗鐫鍙互鍦ㄤ換浣曠嚎紼嬩笂鍒涘緩紿楀彛錛屼絾紿楀彛涓鏃﹀垱寤哄悗灝變笉鑳藉垏鎹㈢嚎紼嬶紝騫朵笖瀵瑰畠鐨勬墍鏈夊嚱鏁拌皟鐢ㄩ兘蹇呴』鍦ㄥ叾鍒涘緩綰跨▼涓婂彂鐢熴傞櫎浜?span lang="EN-US"> Windows 紿椾綋涔嬪錛?span lang="EN-US">.NET Framework 涓殑綾諱嬌鐢ㄨ嚜鐢辯嚎紼嬫ā鍨嬨?span lang="EN-US">
STA
妯″瀷瑕佹眰闇浠庢帶浠剁殑闈炲垱寤虹嚎紼嬭皟鐢ㄧ殑鎺т歡涓婄殑浠諱綍鏂規(guī)硶蹇呴』琚皝閫佸埌錛堝湪鍏朵笂鎵ц錛夎鎺т歡鐨勫垱寤虹嚎紼嬨傚熀綾?span lang="EN-US"> Control 涓烘鐩殑鎻愪緵浜?jiǎn)鑻ヲq叉柟娉曪紙Invoke銆?span lang="EN-US">BeginInvoke 鍜?span lang="EN-US"> EndInvoke錛夈?b>Invoke鐢熸垚鍚屾鏂規(guī)硶璋冪敤錛?b>BeginInvoke鐢熸垚寮傛鏂規(guī)硶璋冪敤銆?span lang="EN-US">
Windows
紿椾綋涓殑鎺т歡琚粦瀹氬埌鐗瑰畾鐨勭嚎紼嬶紝涓嶅叿澶囩嚎紼嬪畨鍏ㄦс傚洜姝わ紝濡傛灉浠庡彟涓涓嚎紼嬭皟鐢ㄦ帶浠剁殑鏂規(guī)硶錛岄偅涔堝繀欏諱嬌鐢ㄦ帶浠剁殑涓涓?span lang="EN-US"> Invoke 鏂規(guī)硶鏉ュ皢璋冪敤灝侀佸埌閫傚綋鐨勭嚎紼嬨?span lang="EN-US">
姝e鎵鐪嬪埌鐨勶紝鎴戜滑蹇呴』璋冪敤 Invoke 鏂規(guī)硶錛岃?/span> BeginInvoke 鍙互璁や負(fù)鏄?/span> Invoke 鐨勫紓姝ョ増鏈傝皟鐢ㄦ柟娉曞涓嬶細(xì)
public
delegate
void OutDelegate(string text);
public
void OutText(string text)
{
聽聽聽聽 txt.AppendText(text);
聽聽聽聽 txt.AppendText( "\t\n" );
}
OutDelegate outdelegate = new OutDelegate( OutText );
this
.BeginInvoke(outdelegate, newobject[]{text});
濡傛灉鎴戜滑闇瑕佸湪鍙﹀涓涓嚎紼嬮噷闈㈠ UI 榪涜鎿嶄綔錛屾垜浠渶瑕佷竴涓被浼?/span> OutText 鐨勫嚱鏁幫紝榪橀渶瑕佷竴涓鍑芥暟鐨勫鎵?/span> delegate 錛屽綋鐒?dòng)灱寴q欓噷灞曠ず鐨勬槸鑷畾涔夌殑錛?/span> .net 涓繕鏈夊緢澶氬叾浠栫被鍨嬬殑濮旀墭錛屽彲浠ョ洿鎺ヤ嬌鐢紝涓嶉渶瑕佽屽澹版槑銆備緥濡傦細(xì) MethodInvoker 鍜?/span> EventHandler 錛岃繖涓ょ綾誨瀷濮旀墭鐨勫嚱鏁板瑙傛槸鍥哄畾鐨勶紝 MethodInvoker 鏄?/span> void Function() 綾誨瀷鐨勫鎵橈紝鑰?/span> EventHandler 鏄?/span> void Function(object, EventArgs) 綾誨瀷鐨勫鎵橈紝絎竴涓笉鏀寔鍙傛暟錛岀浜屼腑鐨勫弬鏁扮被鍨嬪拰鏁伴噺閮芥槸鍥哄畾鐨勶紝榪欎袱縐嶅鎵樺彲浠ュ緢鏂逛究鐨勮皟鐢紝浣嗘槸緙轟箯鐏墊椿鎬с傝娉ㄦ剰 BeginInvoke 鍓嶉潰鐨勫璞℃槸 this 錛屼篃灝辨槸涓葷嚎紼嬨傜幇鍦ㄥ啀浠嬬粛 Control.InvokeRequired 錛?/span> Control 鏄墍鏈夋帶浠剁殑鍩虹被錛屽浜庤繖涓睘鎬?/span> MSDN 鐨勬弿榪版槸錛?/span>
鑾峰彇涓涓鹼紝璇ュ兼寚紺鴻皟鐢ㄦ柟鍦ㄥ鎺т歡榪涜鏂規(guī)硶璋冪敤鏃舵槸鍚﹀繀欏昏皟鐢?/span>
Invoke
鏂規(guī)硶錛屽洜涓鴻皟鐢ㄦ柟浣嶄簬鍒涘緩鎺т歡鎵鍦ㄧ殑綰跨▼浠ュ鐨勭嚎紼嬩腑銆?/span>
璇ュ睘鎬у彲鐢ㄤ簬紜畾鏄惁蹇呴』璋冪敤
Invoke
鏂規(guī)硶錛屽綋涓嶇煡閬撲粈涔堢嚎紼嬫嫢鏈夋帶浠舵椂榪欏緢鏈夌敤銆?/span>
涔熷氨鏄閫氳繃鍒ゆ柇 InvokeRequired 鍙互鐭ラ亾鏄惁闇瑕佺敤濮旀墭鏉ヨ皟鐢ㄥ綋鍓嶆帶浠剁殑涓浜涙柟娉曪紝濡傛鍙互鎶?/span> OutText 鍑芥暟淇敼涓涓嬶細(xì)
public
delegate
void OutDelegate(string text);
public
void OutText(string text)
{
聽聽聽聽
if( txt.InvokeRequired )
聽聽聽聽 {
聽聽聽聽聽聽聽聽 OutDelegate outdelegate = new OutDelegate( OutText );
聽聽聽聽聽聽聽聽
this.BeginInvoke(outdelegate, newobject[]{text});
聽聽聽聽聽聽聽聽
return;
聽聽聽聽 }
聽聽聽聽 txt.AppendText(text);
聽聽聽聽 txt.AppendText( "\t\n" );
}
娉ㄦ剰錛岃繖閲岀殑鍑芥暟娌℃湁榪斿洖錛屽鏋滄湁榪斿洖錛岄渶瑕佽皟鐢?/span> Invoke 鎴栬?/span> EndInvoke 鏉ヨ幏寰楄繑鍥炵殑緇撴灉錛屼笉瑕佸洜涓哄寘瑁呰屼涪澶變簡(jiǎn)榪斿洖鍊箋傚鏋滆皟鐢ㄦ病鏈夊畬鎴愶紝 Invoke 鍜?/span> EndInvoke 閮藉皢浼?xì)寮曡捣闃诲銆?/span>
鐜板湪濡傛灉鎴戞湁涓涓嚎紼嬪嚱鏁板涓嬶細(xì)
public
void ThreadProc()
{
聽聽聽聽
for(int i = 0; i < 5; i++)
聽聽聽聽 {
聽聽聽聽聽聽聽聽 OutText( i.ToString() );
聽聽聽聽聽聽聽聽 Thread.Sleep(1000);
聽聽聽聽 }
}
濡傛灉寰幆鐨勬鏁板緢澶э紝鎴栬呮紡浜?/span> Thread.Sleep(1000); 錛岄偅涔堜綘鐨?/span> UI 鑲畾浼?xì)鍋滄鍝嶅簲锛屾兂鐭ラ亾鍘熷洜鍚楀Q熺湅鐪?/span> BeginInvoke 鍓嶉潰鐨勫璞★紝娌¢敊錛屽氨鏄?/span> this 錛屼篃灝辨槸涓葷嚎紼嬶紝褰撲綘鐨勪富綰跨▼涓嶅仠鐨勮皟鐢?/span> OutText 鐨勬椂鍊欙紝 UI 褰撶劧浼?xì)鍋滄鍝嶅簲銆?/span>
涓庝互鍓?/span>
VC
涓垱寤轟竴涓柊鐨勭嚎紼嬮渶瑕佽皟鐢?/span>
AfxBeginThread
鍑芥暟錛岃鍑芥暟涓涓涓弬鏁板氨鏄嚎紼嬪嚱鏁扮殑鍦板潃錛岃岀浜屼釜鍙傛暟鏄竴涓被鍨嬩負(fù)
LPVOID
鐨勬寚閽堢被鍨嬶紝榪欎釜鍙傛暟灝嗕紶閫掔粰綰跨▼鍑芥暟銆傜幇鍦ㄦ垜浠病鏈夊姙娉曞啀浣跨敤榪欑鏂規(guī)硶鏉ヤ紶閫掑弬鏁頒簡(jiǎn)銆傛垜浠渶瑕佸皢浼犻掔粰綰跨▼鐨勫弬鏁板拰綰跨▼鍑芥暟鍖呰鎴愪竴涓崟鐙殑綾伙紝鐒跺悗鍦ㄨ繖涓被鐨勬瀯閫犲嚱鏁頒腑鍒濆鍖栬綰跨▼鎵闇鐨勫弬鏁幫紝鐒跺悗鍐嶅皢璇ュ疄渚嬬殑綰跨▼鍑芥暟浼犻掔粰
Thread
綾葷殑鏋勯犲嚱鏁般備唬鐮佸ぇ鑷村涓嬶細(xì)
public
class ProcClass
{
聽聽聽聽
private
string procParameter = "";
聽聽聽聽
public ProcClass(string parameter)
聽聽聽聽 {
聽聽聽聽聽聽聽聽 procParameter = parameter;
聽聽聽聽 }
聽聽聽聽
public
void ThreadProc()
聽聽聽聽 {
聽聽聽聽 }
}
ProcClass threadProc = new ProcClass("use thread class");
Thread thread = new Thread( new ThreadStart( threadProc.ThreadProc ) );
thread.IsBackground = true;
thread.Start();
灝辨槸榪欐牱錛岄渶瑕佸緩绔嬩竴涓腑闂寸被鏉ヤ紶閫掔嚎紼嬫墍闇鐨勫弬鏁般?/span>
閭d箞濡傛灉鎴戠殑綰跨▼鍙堥渶瑕佸弬鏁幫紝鍙堥渶瑕佸拰 UI 榪涜浜や簰鐨勬椂鍊欒鎬庝箞鍔炲憿錛熷彲浠ヤ慨鏀逛竴涓嬩唬鐮侊細(xì)
public
class ProcClass
{
聽聽聽聽
private
string procParameter = "";
聽聽聽聽
private Form1.OutDelegate delg = null;
聽聽聽聽
public ProcClass(string parameter, Form1.OutDelegate delg)
聽聽聽聽 {
聽聽聽聽聽聽聽聽 procParameter = parameter;
聽聽聽聽聽聽聽聽
this.delg = delg;
聽聽聽聽 }
聽聽聽聽
public
void ThreadProc()
聽聽聽聽 {
聽聽聽聽聽聽聽聽 delg.BeginInvoke("use ProcClass.ThreadProc()", null, null);
聽聽聽聽 }
}
ProcClass threadProc = new ProcClass("use thread class", new OutDelegate(OutText));
Thread thread = new Thread( new ThreadStart( threadProc.ThreadProc ) );
thread.IsBackground = true;
thread.Start();
榪欓噷鍙槸鎴戠殑涓浜涚悊瑙o紝濡傛灉鏈変粈涔堥敊璇垨鑰呬笉褰撶殑鍦版柟錛屾榪庢寚鍑恒?/span>
public void afunction(object o)
{
// do what ever the function is supposed to do.
}
//thread entry code
{
// create an instance of WaitCallback
WaitCallback myCallback = new WaitCallback (afunction);
//add this to the thread pool / queue a task
ThreadPool.QueueUserWorkItem (myCallback);
}
銆銆浣犱篃鍙互閫氳繃璋冪敤ThreadPool.RegisterWaitForSingleObject鏂規(guī)硶鏉ヤ紶閫掍竴涓猄ystem.Threading.WaitHandle,褰撹閫氱煡鎴栬呮椂闂磋秴榪囦簡(jiǎn)璋冪敤琚玈ystem.Threading.WaitOrTimerCallback鍖呰鐨勬柟娉曘?/p>
銆銆綰跨▼姹犲拰鍩轟簬浜嬩歡鐨勭紪紼嬫ā寮忎嬌寰楃嚎紼嬫睜瀵規(guī)敞鍐岀殑WaitHandles鐨勭洃鎺у拰瀵瑰悎閫傜殑WaitOrTimerCallback浠h〃鏂規(guī)硶鐨勮皟鐢ㄥ崄鍒嗙畝鍗?褰揥aitHandle琚噴鏀炬椂)銆傝繖浜涘仛娉曞叾瀹炲緢綆鍗曘傝繖閲屾湁涓涓嚎紼嬩笉鏂殑瑙傛祴鍦ㄧ嚎紼嬫睜闃熷垪絳夊緟鎿嶄綔鐨勭姸鎬併備竴鏃︾瓑寰呮搷浣滃畬鎴?涓涓嚎紼嬪皢琚墽琛屼笌鍏跺搴旂殑浠誨姟銆傚洜姝?榪欎釜鏂規(guī)硶闅忕潃鍑哄彂瑙﹀彂浜嬩歡鐨勫彂鐢熻屽鍔犱竴涓嚎紼嬨?br />
銆銆璁╂垜浠湅鐪嬫庝箞闅忎簨浠舵坊鍔犱竴涓嚎紼嬪埌綰跨▼姹?鍏跺疄寰堢畝鍗曘傛垜浠彧闇瑕佸垱寤轟竴涓狹anualResetEvent綾葷殑浜嬩歡鍜屼竴涓猈aitOrTimerCallback鐨勪唬琛?鐒跺悗鎴戜滑闇瑕佷竴涓惡甯︿唬琛ㄧ姸鎬佺殑瀵硅薄,鍚屾椂鎴戜滑涔熻鍐沖畾浼戞伅闂撮殧鍜屾墽琛屾柟寮忋傛垜浠皢涓婇潰鐨勯兘娣誨姞鍒扮嚎紼嬫睜,騫朵笖嬋鍙戜竴涓簨浠?
public void afunction(object o)
{
// do what ever the function is supposed to do.
}
//object that will carry the status information
public class anObject
{
}
//thread entry code
{
//create an event object
ManualResetEvent aevent = new ManualResetEvent (false);
// create an instance of WaitOrTimerCallback
WaitOrTimerCallback thread_method = new WaitOrTimerCallback (afunction);
// create an instance of anObject
anObject myobj = new anObject();
// decide how thread will perform
int timeout_interval = 100; // timeout in milli-seconds.
bool onetime_exec = true;
//add all this to the thread pool.
ThreadPool. RegisterWaitForSingleObject (aevent, thread_method, myobj, timeout_interval, onetime_exec);
// raise the event
aevent.Set();
}
銆銆鍦≦ueueUserWorkItem鍜孯egisterWaitForSingleObject鏂規(guī)硶涓?綰跨▼姹犲垱寤轟簡(jiǎn)涓涓悗鍙扮殑綰跨▼鏉ュ洖璋冦傚綋綰跨▼姹犲紑濮嬫墽琛屼竴涓換鍔?涓や釜鏂規(guī)硶閮藉皢璋冪敤鑰呯殑鍫嗘爤鍚堝茍鍒扮嚎紼嬫睜鐨勭嚎紼嬪爢鏍堜腑銆傚鏋滈渶瑕佸畨鍏ㄦ鏌ュ皢鑰楄垂鏇村鐨勬椂闂村拰澧炲姞緋葷粺鐨勮礋鎷?鍥犳鍙互閫氳繃浣跨敤瀹冧滑瀵瑰簲鐨勪笉瀹夊叏鐨勬柟娉曟潵閬垮厤瀹夊叏媯(gè)鏌ャ傚氨鏄疶hreadPool.UnsafeRegisterWaitForSingleObject 鍜孴hreadPool.UnsafeQueueUserWorkItem銆?br />
銆銆浣犱篃鍙互瀵逛笌絳夊緟鎿嶄綔鏃犲叧鐨勪換鍔℃帓闃熴?Timer-queue timers and registered wait operations涔熶嬌鐢ㄧ嚎紼嬫睜銆傚畠浠殑榪斿洖鏂規(guī)硶涔熻鏀懼叆綰跨▼姹犳帓闃熴?br />
銆銆綰跨▼姹犳槸闈炲父鏈夌敤鐨?琚箍娉涚殑鐢ㄤ簬銆侼ET騫沖彴涓婄殑濂楄妭瀛愮紪紼?絳夊緟鎿嶄綔娉ㄥ唽,榪涚▼璁℃椂鍣ㄥ拰寮傛鐨処/O銆傚浜庡皬鑰岀煭鐨勪換鍔?綰跨▼姹犳彁渚涚殑鏈哄埗涔熸槸鍗佸垎渚垮埄澶勪簬澶氱嚎紼嬬殑銆傜嚎紼嬫睜瀵逛簬瀹屾垚璁稿鐙珛鐨勪換鍔¤屼笖涓嶉渶瑕侀愪釜鐨勮緗嚎紼嬪睘鎬ф槸鍗佸垎渚垮埄鐨勩備絾鏄?浣犱篃搴旇寰堟竻妤?鏈夊緢澶氱殑鎯呭喌鏄彲浠ョ敤鍏朵粬鐨勬柟娉曟潵鏇夸唬綰跨▼姹犵殑銆傛瘮濡傝浣犵殑璁″垝浠誨姟鎴栫粰姣忎釜綰跨▼鐗瑰畾鐨勫睘鎬?鎴栬呬綘闇瑕佸皢綰跨▼鏀懼叆鍗曚釜綰跨▼鐨勭┖闂?鑰岀嚎紼嬫睜鏄皢鎵鏈夌殑綰跨▼鏀懼叆涓涓綰跨▼絀洪棿),鎶戞垨鏄竴涓壒瀹氱殑浠誨姟鏄緢鍐楅暱鐨?榪欎簺鎯呭喌浣犳渶濂借冭檻娓呮,瀹夊叏鐨勫姙娉曟瘮鐢ㄧ嚎紼嬫睜搴旇鏄綘鐨勯夋嫨銆?br />
System.Threading.Timer Class
銆銆Timer綾誨浜庡懆鏈熸х殑鍦ㄥ垎紱葷殑綰跨▼鎵ц浠誨姟鏄潪甯告湁鏁堢殑,瀹冧笉鑳借緇ф壙銆?br />
銆銆榪欎釜綾誨挨鍏剁敤鏉ュ紑鍙戞帶鍒跺彴搴旂敤紼嬪簭,鍥犱負(fù)System.Windows.Forms.Time鏄笉鍙敤鐨勩傛瘮濡傚悓鏉ュ浠芥枃浠跺拰媯(gè)鏌ユ暟鎹簱鐨勪竴鑷存с?/p>
銆銆褰撳垱寤篢imer瀵硅薄鏃?浣犺嵂浼拌鍦ㄧ涓涓唬鐞嗚皟鐢ㄤ箣鍓嶇瓑寰呯殑鏃墮棿鍜屽悗鏉ョ殑姣忔鎴愬姛璋冪敤涔嬮棿鐨勬椂闂淬備竴涓畾鏃惰皟鐢ㄥ彂鐢熷湪鏂規(guī)硶鐨勫簲寰楁椂闂磋繃鍘?騫朵笖鍦ㄥ悗鏉ュ懆鏈熸х殑璋冪敤榪欎釜鏂規(guī)硶銆備綘鍙互閫傚簲Timer鐨凜hange鏂規(guī)硶鏉ユ敼鍙樿繖浜涜緗殑鍊兼垨鑰呬嬌Timer澶辨晥銆傚綋瀹氭椂鍣═imer涓嶅啀浣跨敤鏃?浣犲簲璇ヨ皟鐢―ispose鏂規(guī)硶鏉ラ噴鏀懼叾璧勬簮銆?br />
銆銆TimerCallback浠h〃璐熻矗鎸囧畾涓嶵imer瀵硅薄鐩稿叧鑱旂殑鏂規(guī)硶(灝辨槸瑕佸懆鏈熸墽琛岀殑浠誨姟)鍜岀姸鎬併傚畠鍦ㄦ柟娉曞簲寰楃殑鏃墮棿榪囧幓涔嬪悗璋冪敤涓嬈″茍涓斿懆鏈熸х殑璋冪敤榪欎釜鏂規(guī)硶鐩村埌璋冪敤浜?jiǎn)Dispose鏂規(guī)硶閲婃斁浜?jiǎn)Timer鐨勬墍鏈夎祫婧愩傜郴緇熻嚜鍔ㄥ垎閰嶅垎紱葷殑綰跨▼銆?br />
銆銆璁╂垜浠潵鐪嬩竴孌典唬鐮佺湅鐪嬩簨濡備綍鍒涘緩Timer瀵硅薄鍜屼嬌鐢ㄥ畠鐨勩傛垜浠鍏堣鍒涘緩涓涓猅imerCallback浠g悊,鍦ㄥ悗闈㈢殑鏂規(guī)硶涓浣跨敤鍒扮殑銆傚鏋滈渶瑕?涓嬩竴姝ユ垜浠鍒涘緩涓涓姸鎬佸璞?瀹冩嫢鏈変笌琚唬鐞嗚皟鐢ㄧ殑鏂規(guī)硶鐩稿叧鑱旂殑鐗瑰畾淇℃伅銆備負(fù)浜?jiǎn)鋴蓸q欎簺綆鍗曚竴浜?鎴戜滑浼犻掍竴涓┖鍙傛暟銆傛垜浠皢瀹炰緥鍖栦竴涓猅imer瀵硅薄,鐒跺悗鍐嶄嬌鐢–hange鏂規(guī)硶鏀瑰彉Timer鐨勮緗?鏈鍚庤皟鐢―ispose鏂規(guī)硶閲婃斁璧勬簮銆?br />
// class that will be called by the Timer
public class WorkonTimerReq
{
public void aTimerCallMethod()
{
// does some work
}
}
//timer creation block
{
//instantiating the class that gets called by the Timer.
WorkonTimerReq anObj = new WorkonTimerReq () ;
// callback delegate
TimerCallback tcallback = new TimerCallback(anObj. aTimerCallMethod) ;
// define the dueTime and period
long dTime = 20 ; // wait before the first tick (in ms)
long pTime = 150 ; // timer during subsequent invocations (in ms)
// instantiate the Timer object
Timer atimer = new Timer(tcallback, null, dTime, pTime) ;
// do some thing with the timer object
...
//change the dueTime and period of the Timer
dTime=100;
pTime=300;
atimer.Change(dTime, pTime) ;
// do some thing
...
atimer.Dispose() ;
...
}
寮傛緙栫▼
銆銆榪欓儴鍒嗗唴瀹瑰鏋滆璁叉竻妤氭湰鏉ュ氨鏄緢澶х殑涓閮ㄥ垎,鍦ㄨ繖閲?鎴戜笉鎵撶畻璇︾粏璁ㄨ榪欎釜涓滆タ,鎴戜滑鍙槸闇瑕佺洿鍒板畠鏄粈涔?鍥犱負(fù)澶氱嚎紼嬬紪紼嬪鏋滃拷寰嬪紓姝ョ殑澶氱嚎紼嬬紪紼嬫樉鐒舵槸涓嶅簲璇ョ殑銆傚紓姝ョ殑澶氱嚎紼嬬紪紼嬫槸浣犵殑紼嬪簭鍙兘浼?xì)鐢ㄥ埌鐨勫彟澶栦竴縐嶅綰跨▼緙栫▼鏂規(guī)硶銆?br />
銆銆鍦ㄥ墠闈㈢殑鏂囩珷鎴戜滑鑺變簡(jiǎn)寰堝ぇ鐨勭瘒騫呮潵浠嬬粛綰跨▼鐨勫悓姝ュ拰鎬庝箞瀹炵幇綰跨▼鐨勫悓姝?浣嗘槸瀹冩湁涓涓浐鏈夌殑鑷村懡鐨勭己鐐?浣犳垨璁告敞鎰忓埌浜?jiǎn)杩欎竴鐐廣傞偅灝辨槸姣忎釜綰跨▼蹇呴』浣滃悓姝ヨ皟鐢?涔熷氨鏄瓑鍒板叾浠栫殑鍔熻兘瀹屾垚,鍚﹀垯灝遍樆濉炪傚綋鐒?鏌愪簺鎯呭喌涓?瀵逛簬閭d簺閫昏緫涓婄浉浜掍緷璧栫殑浠誨姟鏉ヨ鏄凍澶熺殑銆傚紓姝ョ紪紼嬪厑璁告洿鍔犲鏉傜殑鐏墊椿鎬с備竴涓嚎紼嬪彲浠ヤ綔寮傛璋冪敤,涓嶉渶瑕佺瓑寰呭叾浠栫殑涓滆タ銆備綘鍙互浣跨敤榪欎簺綰跨▼浣滀換浣曠殑浠誨姟,綰跨▼璐熻矗鑾峰彇緇撴灉鎺ㄨ繘榪愯銆傝繖緇欎簣浜?jiǎn)閭d簺闇瑕佺鐞嗘暟鐩法澶х殑璇鋒眰鑰屼笖璐熸媴涓嶈搗璇鋒眰絳夊緟浠d環(huán)鐨勪紒涓氱駭鐨勭郴緇熸洿濂界殑鍙幾緙╂с?br />
銆銆.NET騫沖彴鎻愪緵浜?jiǎn)涓鑷寸殑寮傛緙栫▼鏈哄埗鐢ㄤ簬ASP.NET,I/O,Web Services,Networking,Message絳夈?br />
鍚庤
銆銆鐢變簬瀛︿範(fàn)鐨勬椂鍊欏緢闅炬壘鍒頒腑鏂囪繖鏂歸潰鐨勮祫鏂欙紝鍥犳鎴戝氨鍙ソ瀛︿範(fàn)鑻辨枃鐨勮祫鏂欙紝鐢變簬姘村鉤涓嶉珮錛岀炕璇戠殑鏃跺欏彲鑳介毦鍏嶆洸瑙e師鏂囩殑鎰忔濓紝甯屾湜澶у鑳藉鎸囧嚭錛屽悓鏃跺笇鏈涜繖浜涗笢瑗胯兘澶熺粰澶у鍦ㄥ涔?fàn)杩欐枤w潰鐭ヨ瘑緇欎簣涓瀹氱殑鍙傝冨拰甯姪錛岄偅鎬曟槸涓鐐圭偣錛屽氨寰堟鎱頒簡(jiǎn)銆?/p>
銆銆濡傛灉瀵瑰浜庨樆濉炵姸鎬佺殑綰跨▼璋冪敤Thread.Interrupt錛堬級(jí)鏂規(guī)硶灝嗕嬌綰跨▼鐘舵佹敼鍙橈紝浣嗘槸浼?xì)鎶涘嚭ThreadInterupptedException寮傚父錛屼綘鍙互鎹曡幏榪欎釜寮傚父騫朵笖鍋氬嚭澶勭悊錛屼篃鍙互蹇界暐榪欎釜寮傚父鑰岃榪愯鏃剁粓姝㈢嚎紼嬨傚湪涓瀹氱殑絳夊緟鏃墮棿涔嬪唴錛孴hread.Interrupt錛堬級(jí)鍜孴hread.Abort錛堬級(jí)閮藉彲浠ョ珛鍗沖敜閱掍竴涓嚎紼嬨?br />
銆銆涓嬮潰鎴戜滑灝嗚鏄庡浣曚粠涓涓嚎紼嬩腑姝㈠彟澶栦竴涓嚎紼嬨傚湪榪欑鎯呭喌涓嬶紝鎴戜滑鍙互閫氳繃浣跨敤Thread.Abort錛堬級(jí)鏂規(guī)硶鏉ユ案涔呴攢姣佷竴涓嚎紼嬶紝鑰屼笖灝嗘姏鍑篢hreadAbortException寮傚父銆備嬌緇堢粨鐨勭嚎紼嬪彲浠ユ崟鑾峰埌寮傚父浣嗘槸寰堥毦鎺у埗鎭㈠錛屼粎鏈夌殑鍔炴硶鏄皟鐢═hread.ResetAbort錛堬級(jí)鏉ュ彇娑堝垰鎵嶇殑璋冪敤錛岃屼笖鍙湁褰撹繖涓紓甯告槸鐢變簬琚皟鐢ㄧ嚎紼嬪紩璧風(fēng)殑寮傚父銆傚洜姝わ紝A綰跨▼鍙互姝g‘鐨勪嬌鐢═hread.Abort錛堬級(jí)鏂規(guī)硶浣滅敤浜嶣綰跨▼錛屼絾鏄疊綰跨▼鍗翠笉鑳借皟鐢═hread.ResetAbort錛堬級(jí)鏉ュ彇娑圱hread.Abort錛堬級(jí)鎿嶄綔銆?/p>
銆銆Thread.Abort錛堬級(jí)鏂規(guī)硶浣垮緱緋葷粺鎮(zhèn)勬?zhèn)勭殑閿姣佷簡(jiǎn)綰跨▼鑰屼笖涓嶉氱煡鐢ㄦ埛銆備竴鏃﹀疄鏂絋hread.Abort錛堬級(jí)鎿嶄綔錛岃綰跨▼涓嶈兘琚噸鏂板惎鍔ㄣ傝皟鐢ㄤ簡(jiǎn)榪欎釜鏂規(guī)硶騫朵笉鏄剰鍛崇潃綰跨▼绔嬪嵆閿姣侊紝鍥犳涓轟簡(jiǎn)紜畾綰跨▼鏄惁琚攢姣侊紝鎴戜滑鍙互璋冪敤Thread.Join錛堬級(jí)鏉ョ‘瀹氬叾閿姣侊紝Thread.Join錛堬級(jí)鏄竴涓樆濉炶皟鐢紝鐩村埌綰跨▼鐨勭‘鏄粓姝簡(jiǎn)鎵嶈繑鍥炪備絾鏄湁鍙兘涓涓嚎紼嬭皟鐢═hread.Interrupt錛堬級(jí)鏂規(guī)硶鏉ヤ腑姝㈠彟澶栦竴涓嚎紼嬶紝鑰岃繖涓嚎紼嬫鍦ㄧ瓑寰匱hread.Join錛堬級(jí)璋冪敤鐨勮繑鍥炪?/p>
銆銆灝藉彲鑳界殑涓嶈鐢⊿uspend()鏂規(guī)硶鏉ユ寕璧烽樆濉炵嚎紼嬶紝鍥犱負(fù)榪欐牱寰堝鏄撻犳垚姝婚攣銆傚亣璁句綘鎸傝搗浜?jiǎn)涓涓嚎紼嬶紝鑰岃繖涓嚎紼嬬殑璧勬簮鏄叾浠栫嚎紼嬫墍闇瑕佺殑錛屼細(xì)鍙戠敓浠涔堝悗鏋溿傚洜姝わ紝鎴戜滑灝藉彲鑳界殑緇欓噸瑕佹т笉鍚岀殑綰跨▼浠ヤ笉鍚岀殑浼樺厛綰э紝鐢═hread.Priority錛堬級(jí)鏂規(guī)硶鏉ヤ唬鏇夸嬌鐢═hread.Suspend錛堬級(jí)鏂規(guī)硶銆?br />
銆銆Thread綾繪湁寰堝鐨勫睘鎬э紝榪欎簺閲嶈鐨勫睘鎬ф槸鎴戜滑澶氱嚎紼嬬紪紼嬪繀欏誨緱鎺屾彙鐨勩?br />
銆銆Thread.IsAlive灞炴э細(xì)鑾峰彇涓涓鹼紝璇ュ兼寚紺哄綋鍓嶇嚎紼嬬殑鎵ц鐘舵併傚鏋滄綰跨▼宸插惎鍔ㄥ茍涓斿皻鏈甯哥粓姝㈡垨涓錛屽垯涓?true錛涘惁鍒欎負(fù) false銆?br />
銆銆Thread.Name 灞炴э細(xì)鑾峰彇鎴栬緗嚎紼嬬殑鍚嶇О銆?br />
銆銆Thread.Priority 灞炴э細(xì)鑾峰彇鎴栬緗竴涓鹼紝璇ュ兼寚紺虹嚎紼嬬殑璋冨害浼樺厛綰с?br />銆銆Thread.ThreadState 灞炴э細(xì)鑾峰彇涓涓鹼紝璇ュ煎寘鍚綋鍓嶇嚎紼嬬殑鐘舵併?br />銆銆鍦ㄤ笅闈㈢殑渚嬪瓙涓紝鎴戜滑灝嗙湅鐪嬫庝箞璁劇疆榪欎簺灞炴э紝鍦ㄩ殢鍚庣殑渚嬪瓙涓垜浠皢璇︾粏鐨勮璁鴻繖浜涘睘鎬с?br />銆銆鍒涘緩涓涓嚎紼嬶紝棣栧厛寰楀疄渚嬪寲涓涓猅hread綾伙紝鍦ㄧ被寰楁瀯閫犲嚱鏁頒腑璋冪敤ThreadStart濮旀淳銆傝繖涓媧懼寘鍚簡(jiǎn)綰跨▼浠庡摢閲屽紑濮嬫墽琛屻傚綋綰跨▼鍚姩鍚庯紝Start()鏂規(guī)硶鍚姩涓涓柊鐨勭嚎紼嬨備笅闈㈡槸渚嬪瓙紼嬪簭銆?br />
using System;
using System.Threading ;
namespace LearnThreads
{
class Thread_App
{
public static void First_Thread()
{
銆Console.WriteLine("First thread created");
銆Thread current_thread = Thread.CurrentThread;
銆string thread_details = "Thread Name: " + current_thread.Name + "\r\nThread State: " + current_thread.ThreadState.ToString()+"\r\n Thread Priority level:"+current_thread.Priority.ToString();
銆Console.WriteLine("The details of the thread are :"+ thread_details);
銆Console.WriteLine ("first thread terminated");
}
public static void Main()
{
銆ThreadStart thr_start_func = new ThreadStart (First_Thread);
銆Console.WriteLine ("Creating the first thread ");
銆Thread fThread = new Thread (thr_start_func);
銆fThread.Name = "first_thread";
銆fThread.Start (); //starting the thread
}
}
}
銆銆鍦ㄨ繖涓緥瀛愪腑錛屽垱寤轟簡(jiǎn)涓涓猣Thread鐨勭嚎紼嬪璞★紝榪欎釜綰跨▼璐熻矗鎵цFirst_Thread()鏂規(guī)硶閲岄潰鐨勪換鍔°傚綋Thread鐨凷tart() 鏂規(guī)硶琚皟鐢ㄦ椂鍖呭惈First_Thread()鐨勫湴鍧ThreadStart鐨勪唬鐞嗗皢琚墽琛屻?br />
Thread鐘舵?/strong>
銆銆System.Threading.Thread.ThreadState灞炴у畾涔変簡(jiǎn)鎵ц鏃剁嚎紼嬬殑鐘舵併傜嚎紼嬩粠鍒涘緩鍒扮嚎紼嬬粓姝紝瀹冧竴瀹氬浜庡叾涓煇涓涓姸鎬併傚綋綰跨▼琚垱寤烘椂錛屽畠澶勫湪Unstarted鐘舵侊紝Thread綾葷殑Start() 鏂規(guī)硶灝嗕嬌綰跨▼鐘舵佸彉涓篟unning鐘舵侊紝綰跨▼灝嗕竴鐩村浜庤繖鏍風(fēng)殑鐘舵侊紝闄ら潪鎴戜滑璋冪敤浜?jiǎn)鐩稿簲鐨勬栆?guī)硶浣垮叾鎸傝搗銆侀樆濉炪侀攢姣佹垨鑰呰嚜鐒剁粓姝€傚鏋滅嚎紼嬭鎸傝搗錛屽畠?yōu)畣澶勪簬Suspended鐘舵侊紝闄ら潪鎴戜滑璋冪敤resume錛堬級(jí)鏂規(guī)硶浣垮叾閲嶆柊鎵ц錛岃繖鏃跺欑嚎紼嬪皢閲嶆柊鍙樹負(fù)Running鐘舵併備竴鏃︾嚎紼嬭閿姣佹垨鑰呯粓姝紝綰跨▼澶勪簬Stopped鐘舵併傚浜庤繖涓姸鎬佺殑綰跨▼灝嗕笉澶嶅瓨鍦紝姝e綰跨▼寮濮嬪惎鍔紝綰跨▼灝嗕笉鍙兘鍥炲埌Unstarted鐘舵併傜嚎紼嬭繕鏈変竴涓狟ackground鐘舵侊紝瀹冭〃鏄庣嚎紼嬭繍琛屽湪鍓嶅彴榪樻槸鍚庡彴銆傚湪涓涓‘瀹氱殑鏃墮棿錛岀嚎紼嬪彲鑳藉浜庡涓姸鎬併傛嵁渚嬪瓙鏉ヨ錛屼竴涓嚎紼嬭璋冪敤浜?jiǎn)Sleep鑰屽浜庨樆濉烇紝鑰屾帴鐫鍙﹀涓涓嚎紼嬭皟鐢ˋbort鏂規(guī)硶浜庤繖涓樆濉炵殑綰跨▼錛岃繖鏃跺欑嚎紼嬪皢鍚屾椂澶勪簬WaitSleepJoin鍜孉bortRequested鐘舵併備竴鏃︾嚎紼嬪搷搴旇漿涓篠le闃誨鎴栬呬腑姝紝褰撻攢姣佹椂浼?xì)鎶涘嚭ThreadAbortException寮傚父銆?br />
綰跨▼浼樺厛綰?/strong>
銆銆System.Threading.Thread.Priority鏋氫婦浜?jiǎn)绾拷E嬬殑浼樺厛綰у埆錛屼粠鑰屽喅瀹氫簡(jiǎn)綰跨▼鑳藉寰楀埌澶氬皯CPU鏃墮棿銆傞珮浼樺厛綰х殑綰跨▼閫氬父浼?xì)姣斾竴鑸紭鍏堢駭鐨勭嚎紼嬪緱鍒版洿澶氱殑CPU鏃墮棿錛屽鏋滀笉姝竴涓珮浼樺厛綰х殑綰跨▼錛屾搷浣滅郴緇熷皢鍦ㄨ繖浜涚嚎紼嬩箣闂村驚鐜垎閰岰PU鏃墮棿銆備綆浼樺厛綰х殑綰跨▼寰楀埌鐨凜PU鏃墮棿鐩稿杈冨皯錛屽綋榪欓噷娌℃湁楂樹紭鍏堢駭鐨勭嚎紼嬶紝鎿嶄綔緋葷粺灝嗘寫閫変笅涓涓綆浼樺厛綰?鐨勭嚎紼嬫墽琛屻備竴鏃︿綆浼樺厛綰х殑綰跨▼鍦ㄦ墽琛屾椂閬囧埌浜?jiǎn)楂樹紭鍏埦Uх殑綰跨▼錛屽畠?yōu)畣璁╁嚭CPU緇欓珮浼樺厛綰х殑綰跨▼銆傛柊鍒涘緩鐨勭嚎紼嬩紭鍏堢駭涓轟竴鑸紭鍏堢駭錛屾垜浠彲浠ヨ緗嚎紼嬬殑浼樺厛綰у埆鐨勫鹼紝濡備笅闈㈡墍紺猴細(xì)
銆銆Highest
銆銆AboveNormal
銆銆Normal
銆銆BelowNormal
銆銆Lowest
緇撹錛氬湪榪欎竴閮ㄥ垎錛屾垜浠璁轟簡(jiǎn)綰跨▼鐨勫垱寤轟綍綰跨▼鐨勪紭鍏堢駭銆係ystem.Threading鍛藉悕絀洪棿榪樺寘鍚簡(jiǎn)綰跨▼閿佸畾銆佺嚎紼嬪悓姝ヤ綍閫氳銆佸綰跨▼綆$悊綾諱互鍙?qiáng)姝婚攣瑙e喅绛壗{夐珮綰х壒鎬э紝鍦ㄥ悗闈㈢殑閮ㄥ垎鎴戜滑灝嗙戶緇璁鴻繖浜涘唴瀹廣?/p>
;
聽榪斿洖聽"Brainiac"銆傛湁鍏沖聽CPU聽璁$畻鏈哄悕鐨勮В閲婏紝璇峰弬瑙佸浘聽1聽瀵硅瘽妗嗕腑鐨勬枃鏈偮?br />鐭ラ亾姝g‘鐨勮綆楁満鍚嶅悗錛屽皢鍏朵紶閫掔粰聽RemotePiCalculator.GetPiCalculator錛岃繖鏍鋒墠鍙互閫氳繃聽PiCalculator聽鍙橀噺璁塊棶璇ヨ綆楁満涓婄殑鏈嶅姟鍣ㄥ璞°偮?br />濡傛灉鐢ㄦ埛鍗曞嚮浜?jiǎn)聽Cancel錛堝彇娑堬級(jí)鎸夐挳錛屽皢璁劇疆聽Abort聽灞炴с傚鏋溌燗bort聽灞炴т負(fù)聽true錛岀嚎紼嬪皢鍋滄璁$畻銆偮?br />瀵孤燤F.Invoke聽鐨勮皟鐢ㄤ嬌綰跨▼鍙互瀹夊叏鍦版洿鏂奧燣istView聽涓殑緇熻鏁版嵁錛堝弬瑙佸浘聽2錛夛紝鍗充嬌璇ヂ燣istView聽鏄敱鍙︿竴涓嚎紼嬪垱寤虹殑銆傚湪聽32聽浣嵚燱indows聽緙栫▼涓紝緇濅笉鍏佽鍦ㄥ垱寤烘煇涓帶浠剁殑綰跨▼涔嬪澶勭悊璇ユ帶浠躲偮?br />瀹屾垚寰幆錛堝嵆璁$畻瀹屾寚瀹氱殑鎵鏈壜爌聽浣嶆暟鎴栬呯敤鎴峰崟鍑宦燙ancel聽[鍙栨秷]聽鎸夐挳錛夊悗錛屽皢璋冪敤綰跨▼鐨劼燗utoResetEvent聽鐨劼燬et聽鍑芥暟銆偮?br />褰撴瘡涓嚎紼嬮兘璋冪敤鍏堵燗utoResetEvent聽鐨劼燬et聽鍑芥暟鍚庯紝灝嗚繑鍥炲聽WaitHandle.WaitAll聽鐨勮皟鐢ㄥ茍鏄劇ず緇撴灉銆偮?br />綰跨▼鍚屾
;
http://www.microsoft.com/china/msdn/library/dnbda/html/bdadotnetarch16.asp) 聽涓鏂囧緢鏈夌敤錛屽畠瀵孤?NET聽Web聽Service聽鍜屄?NET聽Remoting聽榪涜浜?jiǎn)姣旇緝銆偮?br />Fabrice聽Bellard's聽Pi聽Page聽(
http://fabrice.bellard.free.fr/pi/) 聽鎻愪緵浜?jiǎn)涓浜涚敤浜庤綆椔爌聽鍊肩殑鏈夌敤鍏紡鍜屾簮浠g爜錛屽寘鎷燚igits聽of聽Pi聽紼嬪簭涓嬌鐢ㄧ殑綆楁硶鐨劼燙聽璇█婧愪唬鐮併偮?br />鏈夊叧榪滅▼璁塊棶紼嬪簭鐨勬簮浠g爜錛岃璁塊棶聽www.personalmicrocosms.com/html/ra.html銆傛紼嬪簭浣跨敤聽.NET聽Remoting聽鏄劇ず榪滅▼璁$畻鏈虹殑妗岄潰錛屽茍浣跨敤鏈湴璁$畻鏈虹殑閿洏鍜岄紶鏍囪繍琛岃繙紼嬭綆楁満銆偮?br />鏈夊叧鏁板鍖栨柟闈㈢殑鍐呭錛岃鍙傞槄聽Petr聽Beckmann聽钁楃殑銆奌istory聽of聽Pi銆嬶紙St.聽Martin's聽Press聽1971聽騫村嚭鐗堬級(jí)錛岃繖鏄竴鏈浉褰撲笉閿欑殑涔︼紝鍥犱負(fù)聽p聽鐨勫巻鍙插氨鏄暟瀛﹀巻鍙茬殑寰鍙嶆槧銆侭eckmann聽鐨勪功娑電洊浜?jiǎn)聽p聽鐨勬暟瀛﹀巻鍙蹭互鍙?qiáng)鏀挎舱d巻鍙層偮?br />Ingo聽Rammer聽鐨勩夾dvanced聽.NET聽Remoting銆嬶紙Apress聽2002聽騫村嚭鐗堬級(jí)鏄湁鍏陳燫emoting聽鐨勬潈濞佹寚鍗椼傛涔︾湅璧鋒潵鏇撮傚悎浠庡ご鍒板熬鐨勮緇嗛槄璇匯傛垜鍊掓槸甯屾湜姝や功鑳藉閫傚悎鎴戠殑鈥滈殢渚跨炕緲燴濈殑闃呰涔?fàn)鎯偮?br />鏈夊叧聽Hardcore聽Visual聽Studio聽.NET聽鍜屄燩innacle聽Publishing聽鐨勮緇嗕俊鎭紝璇瘋闂畠浠殑聽Web聽绔欑偣聽
http://www.pinpub.com/銆?/a>| public interface ISynchronizeInvoke { 銆object Invoke(Delegate銆method,object[] args); 銆IAsyncResult BeginInvoke(Delegate銆method,object[] args); 銆object EndInvoke(IAsyncResult result); 銆bool InvokeRequired {get;} } |
| Form form; /* obtain a reference to the form, then: */ ISynchronizeInvoke synchronizer; synchronizer = form; if(synchronizer.InvokeRequired) { MethodInvoker invoker = new MethodInvoker(form.Close); synchronizer.Invoke(invoker,null); } else form.Close(); |
銆銆鍒楄〃A:
public class Calculator : ISynchronizeInvoke 銆銆銆銆int threadID = Thread.CurrentThread.GetHashCode(); 銆銆銆銆Calculator calc; 銆銆銆銆AddDelegate addDelegate = new AddDelegate(calc.Add); 銆銆銆銆object[] arr = new object[2]; 銆銆銆銆int sum = 0; 銆銆銆銆/* Possible output: |
銆銆鎴栬浣犲茍涓嶆兂榪涜鍚屾璋冪敤錛屽洜涓哄畠琚墦鍖呭彂閫佸埌鍙︿竴涓嚎紼嬩腑鍘諱簡(jiǎn)銆備綘鍙互閫氳繃BeginInvoke()鍜孍ndInvoke()鏂規(guī)硶鏉ュ疄鐜板畠銆備綘鍙互渚濈収閫氱敤鐨?NET闈炲悓姝ョ紪紼嬫ā寮忥紙asynchronous programming model錛夋潵浣跨敤榪欎簺鏂規(guī)硶錛氱敤BeginInvoke()鏉ュ彂閫佽皟鐢紝鐢‥ndInvoke()鏉ュ疄鐜扮瓑寰呮垨鐢ㄤ簬鍦ㄥ畬鎴愭椂榪涜鎻愮ず浠ュ強(qiáng)鏀墮泦榪斿洖緇撴灉銆?br />
銆銆榪樺煎緱涓鎻愮殑鏄疘SynchronizeInvoke鏂規(guī)硶騫墮潪瀹夊叏綾誨瀷銆?綾誨瀷涓嶇浼?xì)瀵艰嚧鍦ㄦ墽琛屾椂琚姏鍑哄紓甯稿Q岃屼笉鏄紪璇戦敊璇傛墍浠ュ湪浣跨敤ISynchronizeInvoke鏃惰鏍煎娉ㄦ剰錛屽洜涓虹紪杈戝櫒鏃犳硶媯(gè)鏌ュ嚭鎵ц閿欒銆?br />
銆銆瀹炵幇ISynchronizeInvoke瑕佹眰浣犱嬌鐢ㄤ竴涓唬鐞嗘潵鍦ㄥ悗鏈熺粦瀹氾紙late binding錛変腑鍔ㄦ佸湴璋冪敤鏂規(guī)硶銆傛瘡涓縐嶄唬鐞嗙被鍨嬪潎鎻愪緵DynamicInvoke()鏂規(guī)硶錛?public object DynamicInvoke(object[]
args);
銆銆鐞嗚涓婃潵璇達(dá)紝浣犲繀欏誨皢涓涓柟娉曚唬鐞嗘斁鍒頒竴涓渶瑕佹彁渚涘璞¤繍琛岀殑鐪熷疄鐨勭嚎紼嬩腑鍘伙紝騫朵嬌Invoke() 鍜孊eginInvoke()鏂規(guī)硶涓殑浠g悊涓皟鐢―ynamicInvoke()鏂規(guī)硶銆侷SynchronizeInvoke鐨勫疄鐜版槸涓涓潪鍚屼竴鑸殑緙栫▼鎶宸э紝鏈枃闄勫甫鐨勬簮鏂囦歡涓寘鍚簡(jiǎn)涓涓悕涓篠ynchronizer鐨勫府鍔╃被錛坔elper class錛夊拰涓涓祴璇曠▼搴忥紝榪欎釜嫻嬭瘯紼嬪簭鏄敤鏉ヨ璇佸垪琛ˋ涓殑Calculator綾繪槸濡備綍鐢⊿ynchronizer綾繪潵瀹炵幇ISynchronizeInvoke鐨勩係ynchronizer鏄疘SynchronizeInvoke鐨勪竴涓櫘閫氬疄鐜幫紝浣犲彲浠ヤ嬌鐢ㄥ畠鐨勬淳鐢熺被鎴栬呭皢鍏舵湰韜綔涓轟竴涓璞℃潵浣跨敤錛屽茍灝咺SynchronizeInvoke瀹炵幇鎸囨淳緇欏畠銆?
銆銆鐢ㄦ潵瀹炵幇Synchronizer鐨勪竴涓噸瑕佸厓绱犳槸浣跨敤涓涓悕涓篧orkerThread鐨勫祵濂楃被錛坣ested class錛夈俉orkerThread涓湁涓涓伐浣滈」鐩紙work item錛夋煡璇€俉orkItem綾諱腑鍖呭惈鏂規(guī)硶浠g悊鍜屽弬鏁般侷nvoke()鍜孊eginInvoke()鐢ㄦ潵灝嗕竴涓伐浣滈」鐩疄渚嬪姞鍏ュ埌鏌ヨ閲屻俉orkerThread鏂板緩涓涓?NET worker綰跨▼錛屽畠璐熻矗鐩戞祴宸ヤ綔欏圭洰鐨勬煡璇換鍔°傛煡璇㈠埌欏圭洰涔嬪悗錛寃orker浼?xì)璇诲彇瀹冧滑锛岀劧鍚庤皟鐢―ynamicInvoke()鏂規(guī)硶銆?/p>