博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
01-多线程及异步委托
阅读量:5943 次
发布时间:2019-06-19

本文共 3949 字,大约阅读时间需要 13 分钟。

一、多线程:

1、概念:

线程:是Windows任务调度的最小单位。线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。
多线程:是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务(代码),也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。 
 
2、为什么要用多线程:
①让计算机"同时"做多件事情,节约时间。
②多线程可以让一个程序“同时”处理多个事情。
③后台运行程序,提高程序的运行效率,也不会使主界面出现无响应的情况。
 
3、产生一个线程的4步骤:
编写产生线程所要执行的方法
引用System.Threading命名空间
实例化Thread类,并传入一个指向线程所要运行方法的委托。(这时候这个线程已经产生,但是还没有运行)
调用Thread实例的Start方法,标记该线程可以被CPU执行了,但具体执行时间由CPU决定。
 
4、.net中如何实现多线程:
线程肯定也是要执行一段代码的。所以要产生一个线程,必须先为该线程写一个方法,这个方法中的代码就是该线程运行所要执行的代码。(找个人来做一件事情)
线程启动时,通过委托调用该方法。(委托的好处)

(线程启动时,调用传过来的委托,委托就会执行相应的方法,实现线程执行方法)

案例代码:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace _07多线程{    class Program    {        static void Main(string[] args)        {            Console.WriteLine("主线程 {0} 正在执行中...", Thread.CurrentThread.ManagedThreadId);            #region 线程            //ThreadStart 无参无返回值的委托            Thread thread = new Thread(ShowMsg);//新开启一个线程执行一个方法            //建议操作系统把当前线程搞成高级别            thread.Priority = ThreadPriority.Highest;            //给开发人员用,来识别不同的线程            thread.Name = "zy";            //后台线程: 如果所有的前台线程都退出了,那么后台线程自动被关闭            thread.IsBackground = true;            thread.Start();//并没有执行,告诉操作系统准备就绪            //thread.Abort();//关闭线程            Console.ReadKey();                   #endregion        }        static void ShowMsg()        {            Console.WriteLine("工作线程 {0} 执行中...",Thread.CurrentThread.ManagedThreadId);            Thread.Sleep(2000);        }    }}
View Code

运行截图:

5、Thread类的一些重要成员:

Start()启动线程
Abort()终止线程
Thread.Sleep(1) 静态方法,可以使当前线程停止一段时间运行
Name线程名
Thread.CurrentThread获得当前的线程引用
 
-----------------------------------------------------------------------------------
二、委托的异步调用:
1、了解一下几点:
BeginInvoke  异步调用
EndInvoke     获取异步调用的(方法)返回值
IAsyncResult  异步操作的状态
AsyncResult   异步操作的结果(可以获取当前执行的委托对象)
using System.Runtime.Remoting.Messaging;
注意:委托的异步调用只对单播委托
 
案例代码:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using System.Runtime.Remoting.Messaging;namespace _07多线程{    public delegate int AddDel(int a,int b);//声明一个有参数有返回值的委托    class Program    {        static void Main(string[] args)        {            Console.WriteLine("主线程 {0} 正在执行中...", Thread.CurrentThread.ManagedThreadId);            AddDel addDel = new AddDel(AddFunc);            //1.同步调用            //int c = addDel(1, 2);            //2.无回调函数的异步调用            //启动委托指向的方法来执行,具体由线程池提供一个线程来执行当前的委托指向的方法            //IAsyncResult ascResult = addDel.BeginInvoke(1, 2, null, null);            //while (!ascResult.IsCompleted)            //{             //    //主线程执行的其他操作            //}            ////此EndInvoke方法会阻塞当前线程。直到委托方法执行完毕后,            ////并将返回值交给result后,继续执行后面的代码            //int result = addDel.EndInvoke(ascResult);            //Console.WriteLine(result);//3            //Console.ReadKey();            //3.有回调函数的异步调用            IAsyncResult ascResult = addDel.BeginInvoke(1, 2, MyDelCallBack, 3);            //主线程可继续执行其他操作            Console.WriteLine("===========");            Console.ReadKey();        }        static int AddFunc(int a, int b)        {            Console.WriteLine("AddFunc工作线程运行中...{0}", Thread.CurrentThread.ManagedThreadId);            //Thread.Sleep(1000);            return a + b;        }        //异步委托执行完成了的回调函数        public static void MyDelCallBack(IAsyncResult result)        {            //把接口类型转换成实例类型            AsyncResult aResult = (AsyncResult)result;            //转换成我们自己的委托类型            AddDel del = (AddDel)aResult.AsyncDelegate;            //执行完成获取执行的结果            int addResult = del.EndInvoke(result);            int state = (int)aResult.AsyncState;//3            Console.WriteLine("异步完成的回调方法执行的结果是:{0} @{1}", addResult, Thread.CurrentThread.ManagedThreadId);        }    }   }
View Code

运行截图:

执行步骤:

①从线程池里获取一个线程。

②执行委托指向的方法(在工作线程里面执行)

③调用回调函数(如果是null不执行)。

 

 

转载于:https://www.cnblogs.com/zy-style/p/4335486.html

你可能感兴趣的文章
【转】Principles of training multi-layer neural network using backpropagation
查看>>
并查集hdu1232
查看>>
改动Androidproject的名称(非Eclipse重命名)
查看>>
tomcat work目录的作用就是编译每个项目里的jsp文件为java文件如果项目没有jsp页面则这个项目文件夹为空...
查看>>
dedecms后台左侧菜单500错误怎么处理
查看>>
Maven配置将war包部署到Tomcat(tomcat7-maven-plugin)
查看>>
Spring MVC学习-------------訪问到静态的文件
查看>>
Unity应用架构设计(11)——一个网络层的构建
查看>>
运行自己的shell脚本
查看>>
内存错误的类别
查看>>
Authentication 方案优化探索(JWT, Session, Refresh Token, etc.)
查看>>
Struts2 关于返回type="chain"的用法.
查看>>
Maven私服安装及配置——(十二)
查看>>
设计模式 - 迭代器模式(iterator pattern) 具体解释
查看>>
Codeforces554B:Ohana Cleans Up
查看>>
【java】jvm查看当前虚拟机堆大小限制
查看>>
python写入excel(xlswriter)--生成图表
查看>>
NetworkStream.write只能使用一次,后面再使用无效
查看>>
oracle进行字符串拆分并组成数组
查看>>
100多个基础常用JS函数和语法集合大全
查看>>