.NET中多线程及Socket

为什么要用多线程:
  让计算机“同时”做多件事情,节约时间
  后台运行程序,提高程序的运行效率,也不会使主界面出现无响应的情况
  可以让一个程序“同时”处理多个事情
  计算机CPU大部分时间处于空闲状态,浪费了CUP资源
进程与线程:运行的一个程序就叫进程,一个进程至少有一个线程(默认UI线程),同一个进程中的多个线程之间可以“并发”执行
线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数
多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同线程来执行不同的任务(代码),也就是说允许单个程序创建多个并执行的线程来完成各自的任务,当多个线程执行同一个函数时,是独立执行的
.NET中如何实现多线程:
线程肯定也是要执行一段代码的,所以要产生一个线程,必须先为该线程写一个方法,这个方法中的代码就是该线程运行所要执行的代码,线程启动时,通过委托调用该方法
  Thread threadFirst = new Thread(ThreadStart start);  // 创建线程 ThreadStart start是一个无返回值无参数的委托
  threadFirst.Start();  // 启动线程,标记该线程可以被CUP执行了,但具体执行时间由CPU决定
  Thread threadFirst = new Thread(ParameterizedThreadStart start); // 创建带object参数的委托
  threadFirst.Start(object param);   // 传入参数并设为启动 
前台线程:只有所有的前台线程都关闭时,才能完成程序的关闭,默认为前台线程
后台线程:只要所有的前台线程结束,后台线程自动结束 
  threadFirst.IsBackground = true;  // 设置为后台线程
方法重入时,当在子线程(非UI线程)中修改一个控件的值时,会出现异常。
  最简单的解决方法:TextBox.CheckForIllegalCrossThreadCalls = false; //关闭对文本框的非法跨线程操作检查
Socket
原意是"孔"或"插座",通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。
socket主要有两种类型:
  流式Socket(Stream):是一种面向连接的socket,针对于面向连接的TCP服务应用,安全,但是效率低
  数据报式Socket(Datagram):是一种无连接的Socket,对就于无连接的UDP服务应用,不安全(丢失,顺序混乱,在接收端要分析重排及要求重发),但效率高 
Socket一般应用模式(服务器-客户端)
  1.服务端首先开始监听端口(负责监客户端连接信息)
  2.客户端连接服务端指定端口(负责接收和发送服务端消息)
  3.服务端监听到客户端连接,创建connection socket(负责和客户端通信)
服务端Socket至少需要两个,一个负责接收客户端连接(不负责通信),每成功接收到一个客户端的连接便在服务端产生一个对应的Socket,负责通信
客户端Socket必须指定要连接的服务端地址和端口,通过创建一个socket对象来初始化一个到服务器端的TCP连接
Socket的通讯过程:
  服务器端:
    申请一个socket
    绑定到一个IP地址和一个端口上
    开启侦听,等待接受连接
  客户端:
    申请一个socket
    连接服务器(指明IP地址和端口号)
    服务器端接到连接请求后,产生一个新的socket(端口大于1024)与客户建立连接并进行通讯,原监听socket继续监听
posted @ 2012-08-18 01:04  韬韬韬你羞得无礼  Views(542)  Comments(0Edit  收藏  举报