thread ,socket
.NET控件必須被自身創建的線程訪問,在任何線程中調用:InvokeRequired,Invoke,BeginInvoke,EndInvoke,CreateGraphics方法都是安全的,可在其他線程中調用這5個方法,使其通過委托(待確認)在控件自身創建線程中得到調用。
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
一旦一個進程所有的前臺線程都終止后,CLR(通用語言運行環境)將通過調用任意一個存活中的后臺進程的Abort()方法來徹底終止進程。
Monitor 類瑣定? 生產者/消費者
http://kb.cnblogs.com/page/42530/2/
threadPool? manualResetEvent?AutoResetEvent 同步
http://www.cnblogs.com/vcool/archive/2008/05/13/1195213.html
timer 可以看出線程是一個系統時間片一直在輪循的
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
====================
線程=》異步操作
因為創建一個線程的代價較高,因此我們使用線程池設法復用線程。
==============?
線程安全
死鎖 ?http://www.cnblogs.com/jeffreyzhao/archive/2009/09/10/dotnet-deadlock-detect.html
=====================
dotnet存在2個默認線程池:1,CLR線程池(工作線程);2,?I/O線程池;????? (暫未提供添加線程池方法)
I/O線程使用情況
{
FileStream操作:BeginRead、BeginWrite。調用BeginRead/BeginWrite時會發起一個異步操作,但是只有在創建FileStream時傳入FileOptions.Asynchronous參數才能獲取真正的IOCP支持,否則BeginXXX方法將會使用默認定義在Stream基類上的實現。Stream基類中BeginXXX方法會使用委托的BeginInvoke方法來發起異步調用——這會使用一個額外的線程來執行任務。雖然當前調用線程立即返回了,但是數據的讀取或寫入操作依舊占用著另一個線程(IOCP支持的異步操作時不需要線程的),因此并沒有任何“節省”,反而還很有可能降低了應用程序的性能,因為額外的線程切換會造成性能損失。
- DNS操作:BeginGetHostByName、BeginResolve。
- Socket操作:BeginAccept、BeginConnect、BeginReceive等等。
- WebRequest操作:BeginGetRequestStream、BeginGetResponse。
- SqlCommand操作:BeginExecuteReader、BeginExecuteNonQuery等等。這可能是開發一個Web應用時最常用的異步操作了。如果需要在執行數據庫操作時得到IOCP支持,那么需要在連接字符串中標記Asynchronous Processing為true(默認為false),否則在調用BeginXXX操作時就會拋出異常。
- WebServcie調用操作:例如.NET 2.0或WCF生成的Web Service Proxy中的BeginXXX方法、WCF中ClientBase<TChannel>的InvokeAsync方法。
}
(時間片)timeslice又被稱為quantum,不同操作系統中定義的這個值并不相同。在Windows客戶端操作系統(XP,Vista)中時間片默認為2個clock interval,在服務器操作系統(2003,2008)中默認為12個clock interval(在主流系統上,1個clock interval大約10到15毫秒)。服務器操作系統使用較長的時間片,是因為一般服務器上運行的程序比客戶端要少很多,且更注重性能和吞吐量,而客戶端系統更注重響應能力——而且,如果您真需要的話,時間片的長度也是可以調整的。
操作多個線程池:smartThreadPool? http://www.codeproject.com/KB/threads/smartthreadpool.aspx
“上下文切換(context switch)"
操作系統中會定義一個“時間片(timeslice)”2,當發現一個線程執行時間超過這個時間,便會把它撤下,換上另外一個。這樣看起來,多個線程——也就是多個任務在同時運行了
并行:多個cpu每個一個進程/線程任務運行?;? 并發:多個進程/線程一個cpu,時間片輪詢切換任務.?
ASP.NET在得到一個請求后,也會將這個請求處理的任務交由CLR線程池去執行
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?老趙試驗結果:
線程的創建 "每秒不超過2個"
- 原來最小線程數量為5時,只有4個線程可以立即執行。經過進一步嘗試,最小線程數量為10時,也只有9個線程可以立即執行。
- 原來線程池創建線程的速度并非永遠是“每秒2個”,而一些資料上寫著“每秒不超過2個”的確是確切的說法。
但是,我們還是驗證了以下幾個結論:
- 在線程池最小線程數量的范圍之內,盡可能多的任務立即執行。
- 線程池使用使用每秒不超過2個的頻率創建線程(1秒一個或0.5秒一個)。
- 當達到線程池最大線程數時(第6秒),停止創建新線程。
- 在舊任務執行完畢后,新任務立即執行。
windows API
異步Socket:?http://www.cnblogs.com/wzd24/archive/2007/06/13/782833.html
使用異步Socket:?在服務端連接比較多而且是長連接的情況下
(*)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); //當主線程執行完成時,本線程會報錯。?? ? ? ? ? ?//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();//這個UserInfo是用來保存客戶信息的。?? ? ? ? ? ? ? ??? ? ? ? ? ? ? ?Socket socket = _listener.Accept();?? ? ? ? ? ? ? ?info.socket = socket;?? ? ? ? ? ? ? ?//這里進行其它處理。?? ? ? ? ? ? ? ?socket.BeginReceive(info.Buffer, 0, info.Buffer.Length,SocketFlags.None,ReceiveCallBack,info);//這里向系統投遞一個接收信息的請求,并為其指定ReceiveCallBack做為回調函數?? ? ? ? ? ?//}?? ? ? ?}
?? ? ? ?//?? ? ? ? private void ReceiveCallBack(IAsyncResult ar)?? ? ? ?{?? ? ? ? ? ?UserInfo info = (UserInfo)ar.AsyncState;?? ? ? ? ? ?Socket handler = info.socket;?? ? ? ? ? ?int readCount = 0;?? ? ? ? ? ?try?? ? ? ? ? ?{?? ? ? ? ? ? ? ?readCount = handler.EndReceive(ar);//調用這個函數來結束本次接收并返回接收到的數據長度。?? ? ? ? ? ?}?? ? ? ? ? ?catch (SocketException)//出現Socket異常就關閉連接?? ? ? ? ? ?{?? ? ? ? ? ? ? ?//CloseSocket(info);//這個函數用來關閉客戶端連接?? ? ? ? ? ? ? ?handler.Close();?? ? ? ? ? ? ? ?return;?? ? ? ? ? ?}?? ? ? ? ? ?catch?? ? ? ? ? ?{?? ? ? ? ? ?}?? ? ? ? ? ?if (readCount > 0)?? ? ? ? ? ?{?? ? ? ? ? ? ? ?byte[] buffer = new byte[readCount];?? ? ? ? ? ? ? ?Buffer.BlockCopy(info.Buffer, 0, buffer, 0, readCount);?? ? ? ? ? ? ? ?//Analyzer(info, buffer);//這個函數用來處理接收到的信息。 。。。。。。。。。。。。。。?? ? ? ? ? ? ? ?try?? ? ? ? ? ? ? ?{?? ? ? ? ? ? ? ? ? ?handler.BeginReceive(info.Buffer, 0, info.Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), info);//向系統投遞下一個接收請求?? ? ? ? ? ? ? ?}?? ? ? ? ? ? ? ?catch (SocketException) //出現Socket異常就關閉連接?? ? ? ? ? ? ? ?{?? ? ? ? ? ? ? ? ? ?//CloseSocket(info);?? ? ? ? ? ? ? ? ? ?handler.Close();?? ? ? ? ? ? ? ?}?? ? ? ? ? ? ? ?catch?? ? ? ? ? ? ? ?{?? ? ? ? ? ? ? ?}?? ? ? ? ? ?}?? ? ? ? ? ?else //如果接收到0字節的數據說明客戶端關閉了Socket,那我們也要關閉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);//這里向系統投遞一個發送數據的請求,并指定一個回調函數。?? ? ? ? ? ?}?? ? ? ? ? ?catch (SocketException ex)?? ? ? ? ? ?{?? ? ? ? ? ? ? ?//CloseSocket(info);?? ? ? ? ? ? ? ??? ? ? ? ? ?}?? ? ? ? ? ?catch?? ? ? ? ? ?{?? ? ? ? ? ?}?? ? ? ?}
?? ? ? ?//
?? ? ? ?private void SendCallBack(IAsyncResult ar)?? ? ? ?{?? ? ? ? ? ?UserInfo info = (UserInfo)ar.AsyncState;?? ? ? ? ? ?try?? ? ? ? ? ?{?? ? ? ? ? ? ? ?info.socket.EndSend(ar);//調用這個函數來結束本次發送。?? ? ? ? ? ?}?? ? ? ? ? ?catch?? ? ? ? ? ?{?? ? ? ? ? ?}?? ? ? ?}
?? ? ? ?class UserInfo?? ? ? ?{?? ? ? ? ? ?public Socket socket=null;?? ? ? ? ? ?public byte[] Buffer;?? ? ? ?}?? ? ? ??? ? ? ?#endregion
??外網IPsocket,訪問某IP內的局域網PC:可以在路由器中配置端口號訪問到對應IP機器,(轉發規則--虛擬服務器) 虛擬服務器定義了廣域網服務端口和局域網網絡服務器之間的映射關系,所有對該廣域網服務端口的訪問將會被重定位給通過IP地址指定的局域網網絡服務器。
由www.LcKey.com?提供支持??
轉載于:https://www.cnblogs.com/thomaswu/archive/2011/04/12/2013799.html
總結
以上是生活随笔為你收集整理的thread ,socket的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vite首次打开界面加载慢问题解决
- 下一篇: 【drawio笔记】新增字体