凡人修仙传之晴天传

小白从零到架构师的修仙之路-多线程(1)

前言

进程,线程,多线程,同步,异步这些概念,接触过的应该都比较熟悉,此处不做赘述,第一次写博客,写的比较烂,纯粹做个分享.

异步

所谓的异步和同步,同步顺序执行,异步则是当线程执行到异步的时候,会跳过继续往下执行,异步委托则开启新的线程去执行异步.

异步委托Action

Action<String> action = Do;
 action.BeginInvoke("some string ", null, null);

执行Do函数 Do参数为BeginInvoke的第一个参数,第二个参数为回调callback,Action的String表示异步委托方法的参数类型为String

Action<String> action = Do;//Do函数打印传入的参数
action.BeginInvoke("some string  ", null, null);
Console.WriteLine("111");

执行结果

some string 
111

异步回调

异步回调指的是异步执行完毕后执行的操作,如下

AsyncCallback callback = ar =>
{
   Console.WriteLine("等待结束");
};
Action<String> action = Do;
action.BeginInvoke("new new new ", callback, null);
Console.WriteLine("111");

执行结果:

111
new new new 
等待结束

线程执行到异步委托跳过,打印111,异步委托执行打印new new new,异步委托执行完毕执行回调函数,打印等待结束.

异步等待

			AsyncCallback callback = ar =>
            {
                Console.WriteLine("等待结束");
            };
            Action<String> action = Do;
           var b =  action.BeginInvoke("new new new ", callback, null);
		  //方式一:一直等待
            while (!b.IsCompleted)
            {
                //Thread.Sleep(100);
            }
			//方式二:一直等待
			b.AsyncWaitHandle.WaitOne(-1);
			//方式三:等待指定毫秒,超时就不等待了继续往下执行
			b.AsyncWaitHandle.WaitOne(1000);
            Console.WriteLine("111");

执行结果:

new new new 
等待结束
111

线程执行至异步操作,跳过继续执行,while循环判断异步操作是否完成,此时主线程等待异步操作执行完毕,开始执行回调函数,回调函数执行完毕,线程继续往下执行.

异步委托Func或Func<>

同样是异步委托,Action没有返回值,Func<>则有.
Func<T,ResultT> T:委托封装的方法的参数类型 ResultT委托封装的方法的返回值类型
Func<T,ResultT>(T arg) T:委托封装的方法的参数类型 ResultT委托封装的方法的返回值类型 arg:委托封装方法的参数,类型T
当<>内只有一个类型时,默认为返回值类型

Func<int> func = () =>
{
	return DateTime.Now.Day;
};
var result = func.BeginInvoke(ar=>
{
	int days = func.EndInvoke(ar);//使用endInvoke获取异步的返回值
	Console.WriteLine(days);
	Thread.Sleep(2000);
	Console.WriteLine("66");
	Thread.Sleep(2000);
	Console.WriteLine("77");
},null);

结果:

111
1
66
77
上一篇:Linux-comm


下一篇:大学Python编程试卷真题!用python循环,输出1+11+111+1111+11111的值