执行结果:


BeginInvoke() 方法用于异步委托的执行开始,EndInvoke() 方法用于结束异步委托,并获取异步委托执行完成后的返回值。IAsyncResult.IsCompleted 用于监视异步委托的执行状态(true / false),这里的时间是不定的,也就是说一定要等到异步委托执行完成之后,这个属性才会返回 true。如果异步委托的方法耗时较长,那么主线程会一直工作下去。
BeginInvoke() 是可以接受多个参数的,它的参数个数和参数类型取决于定义委托时的参数个数和类型,无论它有多少个参数,最后两个参数都是不变的,下面我们会说到。
那么我们还可以用下面的方法 WaitOne(),自定义一个等待的时间,如果在这个等待时间内异步委托没有执行完成,那么就会执行 while 里面的主线程的逻辑,反之就不会执行。
class Program { //定义一个委托类 private delegate UserInfo MyDelegate(UserInfo userInfo); static void Main(string[] args) { ThreadDemoClass demoClass = new ThreadDemoClass(); List<UserInfo> userInfoList = new List<UserInfo>(); UserInfo userInfo = null; UserInfo userInfoRes = null; //创建一个委托并绑定方法 MyDelegate myDelegate = new MyDelegate(demoClass.Run); for (int i = 0; i < 3; i++) { userInfo = new UserInfo(); userInfo.Name = "Brambling" + i.ToString(); userInfo.Age = 33 + i; //传入参数并执行异步委托 IAsyncResult result = myDelegate.BeginInvoke(userInfo,null,null); //阻止当前线程,直到 WaitHandle 收到信号,参数为指定等待的毫秒数 while (!result.AsyncWaitHandle.WaitOne(1000)) { Console.WriteLine("Main thread working..."); Console.WriteLine("Main thread ID is:" + Thread.CurrentThread.ManagedThreadId.ToString()); Console.WriteLine(); } //结束异步委托,并获取返回值 userInfoRes = myDelegate.EndInvoke(result); userInfoList.Add(userInfoRes); } foreach (UserInfo user in userInfoList) { Console.WriteLine("My name is " + user.Name); Console.WriteLine("I'm " + user.Age + " years old this year"); Console.WriteLine("Thread ID is:" + user.ThreadId); } Console.ReadKey(); } } public class ThreadDemoClass { public UserInfo Run(UserInfo userInfo) { userInfo.ThreadId = Thread.CurrentThread.ManagedThreadId; Console.WriteLine("Child thread working..."); Console.WriteLine("Child thread ID is:" + userInfo.ThreadId); Console.WriteLine(); return userInfo; } }
执行结果:

在使用钩子时根据其监视范围的不同可以将其分为全局钩子和线程钩子两大类,其中线程钩子指定某个线程id(可以是当前线程),只能监视该线程。1:#this*#f(#this-1)] , #f(4)"/>
ognl中#的使用#可以取出堆栈上下文中的存放的对象.名称作用例子parameters包含当前http请求参数的map#parameters.id[0]作用相当于request.getparameter("id")request包含当前httpservletrequest的属性(attribute)的map#request.username相当于request.getattribute("username")session包含当前httpsession的属性(attribute)的map#session.username相当于session.getattribute("username")application包含当前应用的servletcontext的属性(attribute)的map#application.username相当于application.getattribute("username")attr用于按request > session > application顺序访问其属性(attribute)获取paraments对象的属性:
class Program { //定义一个委托类 private delegate UserInfo MyDelegate(UserInfo userInfo); static void Main(string[] args) { ThreadDemoClass demoClass = new ThreadDemoClass(); List<UserInfo> userInfoList = new List<UserInfo>(); UserInfo userInfo = null; UserInfo userInfoRes = null; //创建一个委托并绑定方法 MyDelegate myDelegate = new MyDelegate(demoClass.Run); for (int i = 0; i < 3; i++) { userInfo = new UserInfo(); userInfo.Name = "Brambling" + i.ToString(); userInfo.Age = 33 + i; //传入参数并执行异步委托 IAsyncResult result = myDelegate.BeginInvoke(userInfo,null,null); IAsyncResult result1 = myDelegate.BeginInvoke(userInfo, null, null); //定义要监视的对象,不能包含对同一对象的多个引用 WaitHandle[] waitHandles = new WaitHandle[] { result.AsyncWaitHandle, result1.AsyncWaitHandle }; while (!WaitHandle.WaitAll(waitHandles,1000)) { Console.WriteLine("Main thread working..."); Console.WriteLine("Main thread ID is:" + Thread.CurrentThread.ManagedThreadId.ToString()); Console.WriteLine(); } //结束异步委托,并获取返回值 userInfoRes = myDelegate.EndInvoke(result); userInfoList.Add(userInfoRes); userInfoRes = myDelegate.EndInvoke(result1); userInfoList.Add(userInfoRes); } foreach (UserInfo user in userInfoList) { Console.WriteLine("My name is " + user.Name); Console.WriteLine("I'm " + user.Age + " years old this year"); Console.WriteLine("Thread ID is:" + user.ThreadId); } Console.ReadKey(); } } public class ThreadDemoClass { public UserInfo Run(UserInfo userInfo) { userInfo.ThreadId = Thread.CurrentThread.ManagedThreadId; Console.WriteLine("Child thread working..."); Console.WriteLine("Child thread ID is:" + userInfo.ThreadId); Console.WriteLine(); return userInfo; } }
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-106819-2.html
好
我算是写过的
你永远是我们的浪漫功夫熊猫