官方不建议直接使用Thread和线程池,每创建一条线程,都占用CPU时间,再者有些业务本身就不适合多线程,比喻说现在的CPU本身就尝试优化指令,分配到多个线程效率更低了。再加上操作系统处理线程与资源的关系的复杂性,要高效的利用多线程,是一个艰巨的任务,C#觉得在这种重复又繁重的事情上一般开发者没必要在这方面过度深究
Thread本身就是一个多线程,Thread.State()委托;
线程跟进程不一样,这是一个进程包含多个线程
异步跟线程不一样:
同步执行与异步执行:
同步执行:运行一个方法,一定要等这个方法运行结束才能运行下一行,也就是顺序执行。
异步执行:CLR线程,异步IO线程,,就是同时执行,就是多线程同时运行,一个主线程一个副线程
异步多线程直接就是委托的一个多个应用,与委托直接相关委托的调用时三种:1 直接调用 ,2 Invoke(),3 beginInvoke()4 EndINvok()
3 ,4的调用时异步方法,相当于多个线程同时运行
异步多线程,是一个空间换时间,多个线程同时运行,直接进行缩短时间
异步多线程是无序的,而且无法通过执行顺序来进行控制。 Func<string, string> fun = a => a; IAsyncResult result = fun.BeginInvoke("nishiahsd" ,ar=> { nn = "调用ssss"; },null); label2.Text= fun.EndInvoke(result); label1.Text = nn; 回调函数;控制时间,会卡界面 Func<string> acti = () => this.stu(); IAsyncResult async =acti.BeginInvoke(sr=> { Console.WriteLine(acti.EndInvoke(sr)); },"11");这是不等待的,多线程不会卡界面。
每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。
线程池2.0:Threadpool.QueueWorkItem(Lambda表达式); 比以前线程池去掉api来降低复杂度,顺序化的进行运行多个线程 ManualResetEvent mre=new ManualResetEvent(true);(true打开,false关闭) mre.Set();打开 mre.Reset();关闭
Task.run(Action或者Func)启动多线程,传值一个委托。 TaskFactory tt =Task.Factory;//与Task一致开启一个线程 tt.StartNew(一个委托); list<take> ls=new list<take>(); ls.add(tt.StartNew(委托;)) Task.WaitAll(ls.toArry());卡界面,以上添加的几个界面全部执行了才结束。 Task.WaitAny(ls.toArry());某一个任务执行完成后,才运行 tt.ContinueWhenAny(ls.toArry(),Lambda表达式);不会卡界面,回调函数 tt.ContinueWhenAll(ls.toArry(),Lambda表达式);不会卡界面,回调函数 带返回值的 Task<int> task=tt.StartNew(()=>123);Func类型的参数方法; int aa = task.Result; //新的记忆 list<Task> ls=new list<Task>(); ls.add(Task.Run(()=>student() ) ); ls.add(Task.Run( ()=>stutt(); )) Task是基于ThreadPool Task.WaitAll(task)等待所有的线程结束了才开始跑下面的Task Task.WaitAll(task,2000)//最多等待两秒 Task.WaitAny(task)//至少一个线程完成
Parallel.Invoke(Lambda表达式); Parallel.For(0,5,a=>{表达式}); Parallel卡界面,本身就是多线程。 计算的时候直接本身主界面ui线程也直接参与计算,最大化利用,但是也卡界面 如果不介意卡ui可以直接使用,很方便,多个Lanbda用,隔开