thread ,socket
.NET控件必須被自身創(chuàng)建的線程訪問(wèn),在任何線程中調(diào)用:InvokeRequired,Invoke,BeginInvoke,EndInvoke,CreateGraphics方法都是安全的,可在其他線程中調(diào)用這5個(gè)方法,使其通過(guò)委托(待確認(rèn))在控件自身創(chuàng)建線程中得到調(diào)用。
lock InterLocked(原子)
http://www.cnblogs.com/jintianhu/archive/2010/11/19/1881494.html
http://www.cnblogs.com/xd125/archive/2007/12/12/992406.html
thread
一旦一個(gè)進(jìn)程所有的前臺(tái)線程都終止后,CLR(通用語(yǔ)言運(yùn)行環(huán)境)將通過(guò)調(diào)用任意一個(gè)存活中的后臺(tái)進(jìn)程的Abort()方法來(lái)徹底終止進(jìn)程。
Monitor 類瑣定? 生產(chǎn)者/消費(fèi)者
http://kb.cnblogs.com/page/42530/2/
threadPool? manualResetEvent?AutoResetEvent 同步
http://www.cnblogs.com/vcool/archive/2008/05/13/1195213.html
timer 可以看出線程是一個(gè)系統(tǒng)時(shí)間片一直在輪循的
while (s.tmr!=null)
??????????? {
??????????????? Thread.Sleep(0);
??????????? }
mutex 互斥
===============
異步線程:http://www.cnblogs.com/jeffreyzhao/archive/2008/02/24/use-async-operation-properly.html
線程池: http://www.cnblogs.com/jeffreyzhao/archive/2009/07/22/thread-pool-1-the-goal-and-the-clr-thread-pool.html
====================
線程=》異步操作
因?yàn)閯?chuàng)建一個(gè)線程的代價(jià)較高,因此我們使用線程池設(shè)法復(fù)用線程。
==============?
線程安全
死鎖 ?http://www.cnblogs.com/jeffreyzhao/archive/2009/09/10/dotnet-deadlock-detect.html
=====================
dotnet存在2個(gè)默認(rèn)線程池:1,CLR線程池(工作線程);2,?I/O線程池;????? (暫未提供添加線程池方法)
I/O線程使用情況
{
FileStream操作:BeginRead、BeginWrite。調(diào)用BeginRead/BeginWrite時(shí)會(huì)發(fā)起一個(gè)異步操作,但是只有在創(chuàng)建FileStream時(shí)傳入FileOptions.Asynchronous參數(shù)才能獲取真正的IOCP支持,否則BeginXXX方法將會(huì)使用默認(rèn)定義在Stream基類上的實(shí)現(xiàn)。Stream基類中BeginXXX方法會(huì)使用委托的BeginInvoke方法來(lái)發(fā)起異步調(diào)用——這會(huì)使用一個(gè)額外的線程來(lái)執(zhí)行任務(wù)。雖然當(dāng)前調(diào)用線程立即返回了,但是數(shù)據(jù)的讀取或?qū)懭氩僮饕琅f占用著另一個(gè)線程(IOCP支持的異步操作時(shí)不需要線程的),因此并沒有任何“節(jié)省”,反而還很有可能降低了應(yīng)用程序的性能,因?yàn)轭~外的線程切換會(huì)造成性能損失。
- DNS操作:BeginGetHostByName、BeginResolve。
- Socket操作:BeginAccept、BeginConnect、BeginReceive等等。
- WebRequest操作:BeginGetRequestStream、BeginGetResponse。
- SqlCommand操作:BeginExecuteReader、BeginExecuteNonQuery等等。這可能是開發(fā)一個(gè)Web應(yīng)用時(shí)最常用的異步操作了。如果需要在執(zhí)行數(shù)據(jù)庫(kù)操作時(shí)得到IOCP支持,那么需要在連接字符串中標(biāo)記Asynchronous Processing為true(默認(rèn)為false),否則在調(diào)用BeginXXX操作時(shí)就會(huì)拋出異常。
- WebServcie調(diào)用操作:例如.NET 2.0或WCF生成的Web Service Proxy中的BeginXXX方法、WCF中ClientBase<TChannel>的InvokeAsync方法。
}
(時(shí)間片)timeslice又被稱為quantum,不同操作系統(tǒng)中定義的這個(gè)值并不相同。在Windows客戶端操作系統(tǒng)(XP,Vista)中時(shí)間片默認(rèn)為2個(gè)clock interval,在服務(wù)器操作系統(tǒng)(2003,2008)中默認(rèn)為12個(gè)clock interval(在主流系統(tǒng)上,1個(gè)clock interval大約10到15毫秒)。服務(wù)器操作系統(tǒng)使用較長(zhǎng)的時(shí)間片,是因?yàn)橐话惴?wù)器上運(yùn)行的程序比客戶端要少很多,且更注重性能和吞吐量,而客戶端系統(tǒng)更注重響應(yīng)能力——而且,如果您真需要的話,時(shí)間片的長(zhǎng)度也是可以調(diào)整的。
操作多個(gè)線程池:smartThreadPool? http://www.codeproject.com/KB/threads/smartthreadpool.aspx
“上下文切換(context switch)"
操作系統(tǒng)中會(huì)定義一個(gè)“時(shí)間片(timeslice)”2,當(dāng)發(fā)現(xiàn)一個(gè)線程執(zhí)行時(shí)間超過(guò)這個(gè)時(shí)間,便會(huì)把它撤下,換上另外一個(gè)。這樣看起來(lái),多個(gè)線程——也就是多個(gè)任務(wù)在同時(shí)運(yùn)行了
并行:多個(gè)cpu每個(gè)一個(gè)進(jìn)程/線程任務(wù)運(yùn)行?;? 并發(fā):多個(gè)進(jìn)程/線程一個(gè)cpu,時(shí)間片輪詢切換任務(wù).?
ASP.NET在得到一個(gè)請(qǐng)求后,也會(huì)將這個(gè)請(qǐng)求處理的任務(wù)交由CLR線程池去執(zhí)行
http://www.cnblogs.com/jeffreyzhao/archive/2009/01/19/lab-async-request.html?
http://www.cnblogs.com/JeffreyZhao/archive/2009/10/20/thread-pool-3-lab.html?老趙試驗(yàn)結(jié)果:
線程的創(chuàng)建 "每秒不超過(guò)2個(gè)"
- 原來(lái)最小線程數(shù)量為5時(shí),只有4個(gè)線程可以立即執(zhí)行。經(jīng)過(guò)進(jìn)一步嘗試,最小線程數(shù)量為10時(shí),也只有9個(gè)線程可以立即執(zhí)行。
- 原來(lái)線程池創(chuàng)建線程的速度并非永遠(yuǎn)是“每秒2個(gè)”,而一些資料上寫著“每秒不超過(guò)2個(gè)”的確是確切的說(shuō)法。
但是,我們還是驗(yàn)證了以下幾個(gè)結(jié)論:
- 在線程池最小線程數(shù)量的范圍之內(nèi),盡可能多的任務(wù)立即執(zhí)行。
- 線程池使用使用每秒不超過(guò)2個(gè)的頻率創(chuàng)建線程(1秒一個(gè)或0.5秒一個(gè))。
- 當(dāng)達(dá)到線程池最大線程數(shù)時(shí)(第6秒),停止創(chuàng)建新線程。
- 在舊任務(wù)執(zhí)行完畢后,新任務(wù)立即執(zhí)行。
windows API
異步Socket:?http://www.cnblogs.com/wzd24/archive/2007/06/13/782833.html
使用異步Socket:?在服務(wù)端連接比較多而且是長(zhǎng)連接的情況下
(*)http://blog.csdn.net/hulihui/archive/2008/10/27/3158613.aspx
(*)http://supersocket.codeplex.com/releases/view/64669
http://csharp.net-informations.com/communications/csharp-multi-threaded-server-socket.htm
http://www.cnblogs.com/JimmyZhang/archive/2008/09/16/1291854.html
===================================
#region myAnsy?? ? ? ?public void startAnsy()?? ? ? ?{?? ? ? ? ? ?Socket ansyListener = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);?? ? ? ? ? ?var _address = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];?? ? ? ? ? ?var _port = 8888;?? ? ? ? ? ?IPEndPoint localEP = new IPEndPoint(_address, _port);?? ? ? ? ? ?ansyListener.Bind(localEP);?? ? ? ? ? ?ansyListener.Listen(100);?? ? ? ? ? ?Socket ansyAptListener = ansyListener.Accept();?? ? ? ? ? ?byte[] buffer=new byte[1000];
?? ? ? ? ? ?AnsySocketInfo asi = new AnsySocketInfo();?? ? ? ? ? ?asi.skt = ansyAptListener;
?? ? ? ? ? ?ansyAptListener.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None,new AsyncCallback(ansyReceive),asi);?? ? ? ? ? ?MessageBox.Show("go");
?? ? ? ?}
?? ? ? ?public void ansyReceive(IAsyncResult ay)?? ? ? ?{?? ? ? ? ? ?Socket ansyAptListener = ((AnsySocketInfo)ay.AsyncState).skt;?? ? ? ? ? ?int recCount= ansyAptListener.EndReceive(ay); //當(dāng)主線程執(zhí)行完成時(shí),本線程會(huì)報(bào)錯(cuò)。?? ? ? ? ? ?//Thread.Sleep(3000);?? ? ? ? ? ?MessageBox.Show("resule"+recCount.ToString());?? ? ? ?}
?? ? ? ?#endregion
?
?
?#region 2
?? ? ? ?Socket _listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);?? ? ? ?
?? ? ? ?public void ansy2()?? ? ? ?{?? ? ? ? ? ?/*IPHostEntry iphe = Dns.GetHostEntry(Dns.GetHostName());?? ? ? ? ? ?IPAddress ip = iphe.AddressList[0];?? ? ? ? ? ?IPEndPoint ipep = new IPEndPoint(ip, 8888);?? ? ? ? ? ?*/?? ? ? ? ? ?var _address = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];?? ? ? ? ? ?var _port = 8888;?? ? ? ? ? ?IPEndPoint localEP = new IPEndPoint(_address, _port);?? ? ? ? ? ?_listener.Bind(localEP);?? ? ? ? ? ?_listener.Listen(100);
?? ? ? ? ? ? Thread _acceptWorkThread = new Thread(AcceptWorkThread);?? ? ? ? ? ?_acceptWorkThread.Start();?? ? ? ?}
?? ? ? ?private void AcceptWorkThread()?? ? ? ?{?? ? ? ? ? ?//while (_isListener)?? ? ? ? ? ?//{?? ? ? ? ? ? ? ?UserInfo info = new UserInfo();//這個(gè)UserInfo是用來(lái)保存客戶信息的。?? ? ? ? ? ? ? ??? ? ? ? ? ? ? ?Socket socket = _listener.Accept();?? ? ? ? ? ? ? ?info.socket = socket;?? ? ? ? ? ? ? ?//這里進(jìn)行其它處理。?? ? ? ? ? ? ? ?socket.BeginReceive(info.Buffer, 0, info.Buffer.Length,SocketFlags.None,ReceiveCallBack,info);//這里向系統(tǒng)投遞一個(gè)接收信息的請(qǐng)求,并為其指定ReceiveCallBack做為回調(diào)函數(shù)?? ? ? ? ? ?//}?? ? ? ?}
?? ? ? ?//?? ? ? ? private void ReceiveCallBack(IAsyncResult ar)?? ? ? ?{?? ? ? ? ? ?UserInfo info = (UserInfo)ar.AsyncState;?? ? ? ? ? ?Socket handler = info.socket;?? ? ? ? ? ?int readCount = 0;?? ? ? ? ? ?try?? ? ? ? ? ?{?? ? ? ? ? ? ? ?readCount = handler.EndReceive(ar);//調(diào)用這個(gè)函數(shù)來(lái)結(jié)束本次接收并返回接收到的數(shù)據(jù)長(zhǎng)度。?? ? ? ? ? ?}?? ? ? ? ? ?catch (SocketException)//出現(xiàn)Socket異常就關(guān)閉連接?? ? ? ? ? ?{?? ? ? ? ? ? ? ?//CloseSocket(info);//這個(gè)函數(shù)用來(lái)關(guān)閉客戶端連接?? ? ? ? ? ? ? ?handler.Close();?? ? ? ? ? ? ? ?return;?? ? ? ? ? ?}?? ? ? ? ? ?catch?? ? ? ? ? ?{?? ? ? ? ? ?}?? ? ? ? ? ?if (readCount > 0)?? ? ? ? ? ?{?? ? ? ? ? ? ? ?byte[] buffer = new byte[readCount];?? ? ? ? ? ? ? ?Buffer.BlockCopy(info.Buffer, 0, buffer, 0, readCount);?? ? ? ? ? ? ? ?//Analyzer(info, buffer);//這個(gè)函數(shù)用來(lái)處理接收到的信息。 。。。。。。。。。。。。。。?? ? ? ? ? ? ? ?try?? ? ? ? ? ? ? ?{?? ? ? ? ? ? ? ? ? ?handler.BeginReceive(info.Buffer, 0, info.Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), info);//向系統(tǒng)投遞下一個(gè)接收請(qǐng)求?? ? ? ? ? ? ? ?}?? ? ? ? ? ? ? ?catch (SocketException) //出現(xiàn)Socket異常就關(guān)閉連接?? ? ? ? ? ? ? ?{?? ? ? ? ? ? ? ? ? ?//CloseSocket(info);?? ? ? ? ? ? ? ? ? ?handler.Close();?? ? ? ? ? ? ? ?}?? ? ? ? ? ? ? ?catch?? ? ? ? ? ? ? ?{?? ? ? ? ? ? ? ?}?? ? ? ? ? ?}?? ? ? ? ? ?else //如果接收到0字節(jié)的數(shù)據(jù)說(shuō)明客戶端關(guān)閉了Socket,那我們也要關(guān)閉Socket?? ? ? ? ? ?{?? ? ? ? ? ? ? ?//CloseSocket(info);?? ? ? ? ? ? ? ?handler.Close();?? ? ? ? ? ?}?? ? ? ?}
?? ? ? ?//?? ? ? ?public void Send(Socket socket, byte[] message)?? ? ? ?{?? ? ? ? ? ?try?? ? ? ? ? ?{?? ? ? ? ? ? ? ?UserInfo info = new UserInfo();?? ? ? ? ? ? ? ?byte[] _byte=new byte[10];
?? ? ? ? ? ? ? ?info.socket.BeginSend(message,0, _byte.Length, SocketFlags.None, new AsyncCallback(SendCallBack), info);//這里向系統(tǒng)投遞一個(gè)發(fā)送數(shù)據(jù)的請(qǐng)求,并指定一個(gè)回調(diào)函數(shù)。?? ? ? ? ? ?}?? ? ? ? ? ?catch (SocketException ex)?? ? ? ? ? ?{?? ? ? ? ? ? ? ?//CloseSocket(info);?? ? ? ? ? ? ? ??? ? ? ? ? ?}?? ? ? ? ? ?catch?? ? ? ? ? ?{?? ? ? ? ? ?}?? ? ? ?}
?? ? ? ?//
?? ? ? ?private void SendCallBack(IAsyncResult ar)?? ? ? ?{?? ? ? ? ? ?UserInfo info = (UserInfo)ar.AsyncState;?? ? ? ? ? ?try?? ? ? ? ? ?{?? ? ? ? ? ? ? ?info.socket.EndSend(ar);//調(diào)用這個(gè)函數(shù)來(lái)結(jié)束本次發(fā)送。?? ? ? ? ? ?}?? ? ? ? ? ?catch?? ? ? ? ? ?{?? ? ? ? ? ?}?? ? ? ?}
?? ? ? ?class UserInfo?? ? ? ?{?? ? ? ? ? ?public Socket socket=null;?? ? ? ? ? ?public byte[] Buffer;?? ? ? ?}?? ? ? ??? ? ? ?#endregion
??外網(wǎng)IPsocket,訪問(wèn)某IP內(nèi)的局域網(wǎng)PC:可以在路由器中配置端口號(hào)訪問(wèn)到對(duì)應(yīng)IP機(jī)器,(轉(zhuǎn)發(fā)規(guī)則--虛擬服務(wù)器) 虛擬服務(wù)器定義了廣域網(wǎng)服務(wù)端口和局域網(wǎng)網(wǎng)絡(luò)服務(wù)器之間的映射關(guān)系,所有對(duì)該廣域網(wǎng)服務(wù)端口的訪問(wèn)將會(huì)被重定位給通過(guò)IP地址指定的局域網(wǎng)網(wǎng)絡(luò)服務(wù)器。
由www.LcKey.com?提供支持??
轉(zhuǎn)載于:https://www.cnblogs.com/thomaswu/archive/2011/04/12/2013799.html
總結(jié)
以上是生活随笔為你收集整理的thread ,socket的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: vite首次打开界面加载慢问题解决
- 下一篇: 【drawio笔记】新增字体