小白从零到架构师的修仙之路-多线程(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