《.NET Framework第二天》由会员分享,可在线阅读,更多相关《.NET Framework第二天(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、敬杰软件科技多线程&网络编程敬杰软件科技纲要l多线程l网络编程敬杰软件科技委托异步delegate void DL(string str);static void Main(string args)DL MyDl=new DL(SendMail);Console.WriteLine(开始收发邮件);IAsyncResult rusult=MyDl.BeginInvoke(求职,null,null);while(rusult.IsCompleted)MyDl.EndInvoke(rusult);for(int i=0;i 5;i+)Console.WriteLine(正在接收邮件);Thread
2、.Sleep(1000);Console.Read();static void SendMail(string con)Thread.Sleep(3000);for(int i=0;i 5;i+)Console.WriteLine(正在发送邮件:0,con);Thread.Sleep(1000);敬杰软件科技多线程操作系统使用进程将它们正在执行的不同应用程序分开。线程是操作系统分配处理器时间的基本单元,并且进程中可以有多个线程同时执行代码。每个线程都维护异常处理程序、调度优先级和一组系统用于在调度该线程前保存线程上下文的结构。敬杰软件科技多线程支持抢先多任务处理的操作系统可以创建多个进程中的多
3、个线程同时执行的效果。它通过以下方式实现这一点:在需要处理器时间的线程之间分割可用处理器时间,并轮流为每个线程分配处理器时间片。当前执行的线程在其时间片结束时被挂起,而另一个线程继续运行。当系统从一个线程切换到另一个线程时,它将保存被抢先的线程的线程上下文,并重新加载线程队列中下一个线程的已保存线程上下文。时间片的长度取决于操作系统和处理器。由于每个时间片都很小,因此即使只有一个处理器,多个线程看起来似乎也是在同时执行。这实际上就是多处理器系统中发生的情形,在此类系统中,可执行线程分布在多个可用处理器中。敬杰软件科技多线程.NET用Thread创建并控制线程,设置做强先级并获取其状态。Thre
4、ad t1=new Thread(new ThreadStart(tt1.WriteColor);或 Thread t1=new Thread(new ParameterizedThreadStart(tt1.WriteColor);敬杰软件科技多线程名称说明Abort 在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程的过程。调用此方法通常会终止线程。AllocateDataSlot 在所有的线程上分配未命名的数据槽。为了获得更好的性能,请使用以 ThreadStaticAttribute 属性标记的字段。AllocateNamedDataSlot 在所有线
5、程上分配已命名的数据槽。为了获得更好的性能,请使用以 ThreadStaticAttribute 属性标记的字段。BeginCriticalRegion 通知宿主执行将要进入一个代码区域,在该代码区域内线程中止或未处理的异常的影响可能会危害应用程序域中的其他任务。BeginThreadAffinity 通知宿主托管代码将要执行依赖于当前物理操作系统线程的标识的指令。EndCriticalRegion 通知宿主执行将要进入一个代码区域,在该代码区域内线程中止或未处理的异常仅影响当前任务。EndThreadAffinity 通知宿主托管代码已执行完依赖于当前物理操作系统线程的标识的指令。FreeN
6、amedDataSlot 为进程中的所有线程消除名称与槽之间的关联。为了获得更好的性能,请使用以 ThreadStaticAttribute 属性标记的字段。GetApartmentState 返回一个 ApartmentState 值,该值指示单元状态。GetData 在当前线程的当前域中从当前线程上指定的槽中检索值。为了获得更好的性能,请使用以 ThreadStaticAttribute 属性标记的字段。GetDomain 返回当前线程正在其中运行的当前域。GetDomainID 返回唯一的应用程序域标识符。GetNamedDataSlot 查找已命名的数据槽。为了获得更好的性能,请使用以
7、 ThreadStaticAttribute 属性标记的字段。敬杰软件科技多线程名称说明Interrupt 中断处于 WaitSleepJoin 线程状态的线程。Join 阻塞调用线程,直到某个线程终止时为止。MemberwiseClone 创建当前 Object 的浅表副本MemoryBarrier 按如下方式同步内存访问:执行当前线程的处理器在对指令重新排序时,不能采用先执行 MemoryBarrier 调用之后的内存访问,再执行 MemoryBarrier 调用之前的内存访问的方式。ResetAbort 取消为当前线程请求的 Abort。SetApartmentState 在线程启动前设
8、置其单元状态。SetData 在当前正在运行的线程上为此线程的当前域在指定槽中设置数据。为了获得更好的性能,请使用以 ThreadStaticAttribute 属性标记的字段。SetProcessorAffinity 在用于 Xbox 360 的.NET Compact Framework 中,为托管线程设置处理器关联。运行线程的处理器取决于处理器关联。Sleep 已重载。将当前线程阻塞指定的毫秒数。SpinWait 导致线程等待由 iterations 参数定义的时间量。Start 已重载。使线程得以按计划执行。Suspend 已过时。挂起线程,或者如果线程已挂起,则不起作用。TrySet
9、ApartmentState 在线程启动前设置其单元状态。VolatileRead 已重载。读取字段值。无论处理器的数目或处理器缓存的状态如何,该值都是由计算机的任何处理器写入的最新值。VolatileWrite 已重载。立即向字段写入一个值,以使该值对计算机中的所有处理器都可见。敬杰软件科技多线程名称说明CurrentContext 获取线程正在其中执行的当前上下文。CurrentCulture 获取或设置当前线程的区域性。CurrentPrincipal 获取或设置线程的当前负责人(对基于角色的安全性而言)。CurrentThread 获取当前正在运行的线程。CurrentUICultur
10、e 获取或设置资源管理器使用的当前区域性以便在运行时查找区域性特定的资源。ExecutionContext 获取一个 ExecutionContext 对象,该对象包含有关当前线程的各种上下文的信息。IsAlive 获取一个值,该值指示当前线程的执行状态。IsBackground 获取或设置一个值,该值指示某个线程是否为后台线程。IsThreadPoolThread 获取一个值,该值指示线程是否属于托管线程池。ManagedThreadId 获取当前托管线程的唯一标识符。Name 获取或设置线程的名称。Priority 获取或设置一个值,该值指示线程的调度优先级。ThreadState 获取一
11、个值,该值包含当前线程的状态。敬杰软件科技多线程 class MyClass public void MyMethod()Console.WriteLine(方法MyMethod!);MyClass MC=new MyClass();ThreadStart TS=new ThreadStart(MC.MyMethod);Thread ThrTest=new Thread(TS);ThrTest.Start();敬杰软件科技多线程可以为线程分配以下任何一个优先级值:lHighestlAboveNormallNormallBelowNormallLowest 敬杰软件科技多线程Abort中止线程执
12、行。Sleep使线程睡眠一段时间,方法的参数为睡眠的毫秒数。敬杰软件科技多线程成员名称说明Initialized此状态指示线程已初始化但尚未启动。Ready此状态指示线程因无可用的处理器而等待使用处理器。线程准备在下一个可用的处理器上运行。Running此状态指示线程当前正在使用处理器。Standby此状态指示线程将要使用处理器。一次只能有一个线程处于此状态。Terminated 此状态指示线程已完成执行并已退出。Wait此状态指示线程尚未准备好使用处理器,因为它正在等待外围操作完成或等待资源释放。当线程就绪后,将对其进行重排。Transition此状态指示线程在可以执行前等待处理器之外的资源
13、。例如,它可能正在等待其执行堆栈从磁盘中分页。Unknown线程的状态未知。线程的状态ThreadState敬杰软件科技多线程阻塞线程 class Program static Thread ThrTest1,ThrTest2;static void Main(string args)ThreadStart TS1=new ThreadStart(WriteLine1);ThrTest1=new Thread(TS1);ThreadStart TS2=new ThreadStart(WriteLine2);ThrTest2=new Thread(TS2);ThrTest1.Start();Th
14、rTest2.Start();public static void WriteLine1()for(int i=0;i 20;i+)if(i=10)ThrTest2.Join();Console.ForegroundColor=ConsoleColor.Blue;Console.WriteLine(i.ToString()+WriteLine1);Thread.Sleep(500);public static void WriteLine2()for(int i=0;i 0)/卖书过程 Thread.Sleep(1000);num=num-1;Console.WriteLine(售出一本);e
15、lse Console.WriteLine(没有了);敬杰软件科技多线程Monitor 类通过向单个线程授予对象锁来控制对对象的访问。对象锁提供限制访问代码块(通常称为临界区)的能力。当一个线程拥有对象的锁时,其他任何线程都不能获取该锁。敬杰软件科技多线程名称说明Enter 在指定对象上获取排他锁。Exit 释放指定对象上的排他锁。Pulse 通知等待队列中的线程锁定对象状态的更改。PulseAll 通知所有的等待线程对象状态的更改。TryEnter 试图获取指定对象的排他锁。Wait 释放对象上的锁并阻止当前线程,直到它重新获取该锁。敬杰软件科技多线程 void DataHandle()Mo
16、nitor.Enter(this);for(int i=0;i=20;i+)if(dataOutput=5)Console.ForegroundColor=ConsoleColor.Red;Console.WriteLine(Handle睡了);Console.ForegroundColor=ConsoleColor.Black;Monitor.Wait(this);dataOutput+;Console.WriteLine(Thread.CurrentThread.Name+正在处理第+dataOutput+笔数据;!);Thread.Sleep(100);if(dataOutput=5)C
17、onsole.ForegroundColor=ConsoleColor.Red;Console.WriteLine(Handle让别人醒);Console.ForegroundColor=ConsoleColor.Black;Monitor.PulseAll(this);Console.WriteLine();敬杰软件科技多线程 void DataPrint()Monitor.Enter(this);do if(dataOutput=0)Console.ForegroundColor=ConsoleColor.Red;Console.WriteLine(Print睡了);Console.For
18、egroundColor=ConsoleColor.Black;Monitor.Wait(this);Console.Write(Thread.CurrentThread.Name+正在打印第+dataOutput+笔数据;!);Thread.Sleep(100);dataOutput-;dataSum+;Console.WriteLine(总处理数据笔数+dataSum);if(dataOutput=0)Console.ForegroundColor=ConsoleColor.Red;Console.WriteLine(Print让别人醒);Console.ForegroundColor=C
19、onsoleColor.Black;Monitor.PulseAll(this);Console.WriteLine();while(dataSum 0)TcpClient TC=new TcpClient(IP_TB.Text,int.Parse(Port_TB.Text);byte data=Encoding.UTF8.GetBytes(New_TB.Text);NetworkStream NetStr=TC.GetStream();NetStr.Write(data,0,data.Length);writestring(客户端说:+New_TB.Text);New_TB.Clear();
20、Byte newdate=new Byte256;int len=NetStr.Read(newdate,0,newdate.Length);writestring(服务端说:+Encoding.UTF8.GetString(newdate);NetStr.Close();TC.Close();敬杰软件科技服务端服务端CodeUDP/IP通讯监控按钮 thr=new Thread(new ThreadStart(UDPMethod);thr.Start();void UDPMethod()UdpClient sender=new UdpClient(int.Parse(Port_TB.Text
21、);IPEndPoint endpoint=null;while(true)byte bytes=sender.Receive(ref endpoint);writestring(UDP:+Encoding.UTF8.GetString(bytes);敬杰软件科技客户端客户端CodeUDP/IP通讯发送按钮UDPMethod();void UDPMethod()UdpClient sender=new UdpClient();IPEndPoint endpoint=new IPEndPoint(IPAddress.Parse(IP_TB.Text),int.Parse(Port_TB.Text);byte bytes=Encoding.UTF8.GetBytes(New_TB.Text);sender.Send(bytes,bytes.Length,endpoint);writestring(客户端:+New_TB.Text);