.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相关推荐

  1. 对 zebra 的一点理解 thread+socket+read部分 (备忘)

    一.主要从 daemon 的 thread角度 分析备忘. 注意: 具体函数功能详见附录,分析要结合zebra源代码(thread.c中). 1.每个daemon(e.g igmp-snooping. ...

  2. C# socket编程实践——支持广播的简单socket服务器

    在上篇博客简单理解socket写完之后我就希望写出一个websocket的服务器了,但是一路困难重重,还是从基础开始吧,先搞定C# socket编程基本知识,写一个支持广播的简单server/clie ...

  3. android socket创建失败

    ============问题描述============ 实现功能:点击按键,向某个网址的某个端口,发送数据 class textDisitListener implements OnClickLis ...

  4. Java的Socket通信----通过 Socket 实现 TCP 编程之多线程demo(2)

    JAVA Socket简介 所谓socket 通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求或者应答 ...

  5. Socket 基础解析使用ServerSocket建立聊天服务器

     1.socket 简介 Socket 又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求.ServerSocket 用于服务器端,S ...

  6. 流式套接字:基于TCP协议的Socket网络编程(案例2)

    案例:在案例1的基础上实现一个服务器对应多个客户端(多线程),且获得每个客户端的IP. 线程代码: package com.yh.mySocket;import java.io.BufferedRea ...

  7. Java从零开始学四十五(Socket编程基础)

    一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...

  8. Socket Programming on Android

    Socket 编程基础知识: 主要分服务器端编程和客户端编程. 服务器端编程步骤: 1: 创建服务器端套接字并绑定到一个端口上(0-1023是系统预留的,最好大约1024) 2: 套接字设置监听模式等 ...

  9. (转)Thread的中断机制(interrupt)

    先看收集了别人的文章,全面的了解下java的中断: 中断线程 线程的thread.interrupt()方法是中断线程,将会设置该线程的中断状态位,即设置为true,中断的结果线程是死亡.还是等待新的 ...

  10. Android Socket编程

    花了大概两天的时间,终于把Android的Socket编程给整明白了.抽空和大家分享一下:  Socket Programming on Android  Socket 编程基础知识:  主要分服务器 ...

最新文章

  1. 在linux和windows下自动备份数据库
  2. WebKit.NET-0.5简单应用
  3. 变压器符号_3D动画解析油浸式和干式变压器,看完让你秒懂
  4. 如何改变X:\Users\XXX的用户名称
  5. linux一g运行内存不足,在linux运行weblogic出现运行内存不足错误,求鞭挞....
  6. 【51nod】1934 受限制的排列
  7. mysql varchar json_谈谈 MySQL 的 JSON 数据类型
  8. 使用Win7时,出现无法切换电视墙
  9. 采用DIV+CSS布局的好处
  10. 使用ExtendSim进行物流、供应链和运输建模仿真
  11. 一个被加入下载QQ盗号木马Trojan.PSW.QQPass.rie代码的网站
  12. 淘宝天猫购物优惠券系统开发,java后端(ssm)+Android 原生APP,对接淘宝开放平台
  13. JBoss、Geronimo及Tomcat比较分析
  14. WebStorm调试
  15. JavaScript基础知识与脚本语言总结
  16. jQuery 仿问卷星 自定义修改问卷调查表单代码
  17. [2022 CCF BDCI 文心大模型]还在愁没有头像?属于你的个人头像来了!
  18. 【推荐】2022年公用事业行业研究报告产业发展前景市场投资行情分析白皮书(附件中为网盘地址,报告持续更新)
  19. 打造无懈可击的Web设计——流动布局和弹性布局
  20. linux双系统的启动,解决Linux双系统安装卡在启动LOGO

热门文章

  1. python安装失败0x80070005_win10下载安装软件时提示“0x80070005-拒绝访问”
  2. 用opencv和python读取医学图片:mha
  3. 个税计算器-springboot版实现
  4. UOJ #60 [UR #5] 怎样提高智商
  5. 信息流广告的发展前景!
  6. 常见信息流广告有哪些展现形式
  7. 值得推荐的在线报表设计器
  8. mysql 索引间隙锁_关于mysql innodb间隙锁的一些思考
  9. BCLinux7.6
  10. Intellij idea使用eclipse的java代码格式化文件