当前位置: 首页 > news >正文

网站开发设计费 怎么入账电脑速成班短期电脑培训班

网站开发设计费 怎么入账,电脑速成班短期电脑培训班,网站做权重有用吗,网站的图片做多大尺寸一、概念 Task是DotNet3.0之后所推出的一种新的使用多线程的方式,它是基于ThreadPool线程进行封装的。 二、使用多线程的时机 任务能够并发运行的时候,提升速度;优化体验 三、基本使用方法 private void button5_Click(object sender, Ev…

一、概念

Task是DotNet3.0之后所推出的一种新的使用多线程的方式,它是基于ThreadPool线程进行封装的。

二、使用多线程的时机

任务能够并发运行的时候,提升速度;优化体验

三、基本使用方法

        private void button5_Click(object sender, EventArgs e){Log.Info($"Task Start {Thread.CurrentThread.ManagedThreadId.ToString("00")}  {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");Task.Run(() => this.DoSomethingLong("BtnTask_Click1"));Task.Run(() => this.DoSomethingLong("BtnTask_Click2"));Log.Info($"Task End {Thread.CurrentThread.ManagedThreadId.ToString("00")}  {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");}private void DoSomethingLong(string name){Log.Info($"DoSomethingLong Start {Thread.CurrentThread.ManagedThreadId.ToString("00")} {name} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");long result = 0;for (int i = 0; i < 10000000; i++){result += i;}Thread.Sleep(2000);Log.Info($"DoSomethingLong End {Thread.CurrentThread.ManagedThreadId.ToString("00")} {name} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");}

方法一:

Task.Run(() => this.DoSomethingLong("BtnTask_Click1"));

方法二(这种方式是在DotNet4.0之后出现的):

TaskFactory taskFactory = Task.Factory;
taskFactory.StartNew(() => this.DoSomethingLong("btnTask_Click3"));

方法三:

new Task(() => this.DoSomethingLong("btnTask_Click4")).Start();

四、小案例

题目:现在我有一个项目,产品经理负责提需求,设计产品(主线程)。五位同学分别执行策划、前端、后端、数据库、服务器(子线程)。等所有工作完成后(所有子线程运行结束),再通知甲方过来验收

       //什么时候用多线程?//任务能并发进行;private void button7_Click(object sender, EventArgs e){List<Task> taskList = new List<Task>();Log.Info($"项目经理启动一个项目...{Thread.CurrentThread.ManagedThreadId.ToString("00")}");Log.Info($"前置的准备工作...{Thread.CurrentThread.ManagedThreadId.ToString("00")}");Log.Info($"开始变成...{Thread.CurrentThread.ManagedThreadId.ToString("00")}");taskList.Add(Task.Run(() => this.Coding("周同学", "负责策划")));taskList.Add(Task.Run(() => this.Coding("黄同学", "负责前端")));taskList.Add(Task.Run(() => this.Coding("林同学", "负责后端")));taskList.Add(Task.Run(() => this.Coding("陈同学", "负责数据库")));taskList.Add(Task.Run(() => this.Coding("陈同学", "负责服务器")));//会阻塞当前线程,等着某个任务完成后才进行下一行,卡界面Task.WaitAny(taskList.ToArray());Log.Info($"已经有一个人完成了...{Thread.CurrentThread.ManagedThreadId.ToString("00")}");//多线程加快速度,但是全部任务完成后才能执行的操作Task.WaitAll(taskList.ToArray()); //会阻塞当前线程,等着全部任务完成后,才会进入下一行,卡界面Log.Info("告诉甲方验收,上线使用");//Task.WhenAny(taskList.ToArray()).ContinueWith(t =>//{//    Log.Info($"哈哈哈哈我第一个做完了...{Thread.CurrentThread.ManagedThreadId.ToString("00")}");//});//Task.WhenAll(taskList.ToArray()).ContinueWith(t =>//{//    Log.Info($"部署环境,联调测试...{Thread.CurrentThread.ManagedThreadId.ToString("00")}");//});}private void Coding(string name, string task){Log.Info($"Coding {name} Start {task} 线程号:{Thread.CurrentThread.ManagedThreadId.ToString("00")}  时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");long result = 0;for (int i = 0; i < 1000000000; i++){result += i;}Log.Info($"Coding {name} End {task} 线程号:{Thread.CurrentThread.ManagedThreadId.ToString("00")}  时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");}

知识点:

1、这里Task.WaitAll()会阻塞当前线程,等着全部任务完成后才会继续下一行。这种方式会卡界面

2、Task.WaitAll()第二个参数也可以带参,限时等待

3、Task.WaitAny(taskList.ToArray()) ; 会阻塞当前线程,等着某个任务完成后才进行下一行,卡界面

 WaitAll的使用时机(以某宝为例):

一个业务查询操作有多个数据源,首页-多线程并发-拿到全部数据后才能返回

WaitAny的使用时机(以某宝为例):

一个商品搜索有多个数据源,商品搜索-多个数据源-多线程并发-只需要一个结果即可

WaitAll和WaitAny都是阻塞方法,需要完成后再继续,这会导致卡界面 

 WhenAll和WhenAny是非阻塞方法,不会导致卡界面

 五、控制最大线程的并发数量

       private void button8_Click(object sender, EventArgs e){Log.Info($"Coding Start 线程号:{Thread.CurrentThread.ManagedThreadId.ToString("00")}  时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");ThreadPool.SetMinThreads(8, 8);for (int i = 0; i < 100; i++){Task.Run(() => {Log.Info($"{Thread.CurrentThread.ManagedThreadId.ToString("00")}");Thread.Sleep(2000);});}}

这里通过SetMaxThreads去控制最大的线程并发数量,这种方法并不好,因为ThreadPool是全局的。下面写一种比较合适的方法(用10个线程完成1万个任务):

            {//用10个线程完成1万个任务List<int> list = new List<int>();for (int i = 0; i < 10000; i++){list.Add(i);}Action<int> action = i =>{Log.Info($"{Thread.CurrentThread.ManagedThreadId.ToString("00")}");Thread.Sleep(new Random().Next(100, 300));};List<Task> taskList = new List<Task>();//这里先启动任务foreach (var i in list){int k = i;taskList.Add(Task.Run(() => action.Invoke(k)));//判断个数if (taskList.Count > 10){//这里开始等着Task.WaitAny(taskList.ToArray());//等到某个线程完成后,把还没完成的留着,已完成的清掉。//这样就可以完成对数量的控制taskList = taskList.Where(t => t.Status != TaskStatus.RanToCompletion).ToList();}}Task.WhenAll(taskList.ToArray());}

 六、Task任务添加标识

方法一:TaskFactory的StartNew方法可以有一个重载,传入state作为标识

可以看到在Task任务结束后,通过AsyncState可以打印出我们的标识。这种方式我们就可以知道是谁先完成的

方法二:Task方法并没有直接使用的API来传递一个标识,

 七、Task回调

t指的是参数2,回调写到t=>{}里面

Task.Run(()=>this.Coding("哈哈哈","参数2")).ContinueWith(t=>{});

 八、延迟和等待

Task.Delay(1000);//延迟  不会卡
Thread.Sleep(1000);// 等待 卡

  九、Parallel

1、基本介绍:Parallel是基于Task封装的,并行编程。在4.5以后版本出现

2、三种启动方式:

 private void button10_Click(object sender, EventArgs e){Log.Info($"Coding Start 线程号:{Thread.CurrentThread.ManagedThreadId.ToString("00")}  时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");{//启动方式一:Parallel.Invoke(() => this.Coding("哇哈哈", "whh"),()=>this.Coding("啦啦啦", "lll"),()=>this.Coding("哦哦哦", "ooo"),()=>this.Coding("呸呸呸", "ppp"));}{//启动方式二://Parallel.For(0, 5, i => this.Coding("哈哈哈", "Client" + i));}{//启动方式三:Parallel.ForEach(new string[] { "0", "1", "2" ,"3","4"}, i => this.Coding("哈哈哈", "Client" + i));}Log.Info($"Coding End 线程号:{Thread.CurrentThread.ManagedThreadId.ToString("00")}  时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");}

3、限制线程数,用3个线程完成10个任务

   ParallelOptions parallelOptions = new ParallelOptions();parallelOptions.MaxDegreeOfParallelism = 3;Parallel.For(0, 5, parallelOptions, i => this.Coding("哈哈哈", "Client" + i));

这样得出的结果,任意时刻都只有3个线程在工作

4、不卡的方式,用Task再包一层

           Task.Run(() => {ParallelOptions parallelOptions = new ParallelOptions();parallelOptions.MaxDegreeOfParallelism = 3;Parallel.For(0, 5, parallelOptions, i => this.Coding("哈哈哈", "Client" + i));});

 5、线程结束 


文章转载自:
http://dolcevita.rpwm.cn
http://uraniscus.rpwm.cn
http://johns.rpwm.cn
http://rosina.rpwm.cn
http://liberte.rpwm.cn
http://cythera.rpwm.cn
http://machaira.rpwm.cn
http://rongalite.rpwm.cn
http://adoptionism.rpwm.cn
http://revoltive.rpwm.cn
http://classmate.rpwm.cn
http://artemis.rpwm.cn
http://proleg.rpwm.cn
http://sunup.rpwm.cn
http://halobacteria.rpwm.cn
http://hypochromia.rpwm.cn
http://cornettist.rpwm.cn
http://angulately.rpwm.cn
http://cantankerous.rpwm.cn
http://electrowinning.rpwm.cn
http://tax.rpwm.cn
http://undergo.rpwm.cn
http://inconcinnity.rpwm.cn
http://incommodious.rpwm.cn
http://synergetic.rpwm.cn
http://tanna.rpwm.cn
http://prospect.rpwm.cn
http://kengtung.rpwm.cn
http://libido.rpwm.cn
http://papeterie.rpwm.cn
http://flocculence.rpwm.cn
http://haar.rpwm.cn
http://subhumid.rpwm.cn
http://recipient.rpwm.cn
http://fibrillation.rpwm.cn
http://madding.rpwm.cn
http://dunghill.rpwm.cn
http://volatile.rpwm.cn
http://softwood.rpwm.cn
http://waesucks.rpwm.cn
http://craftwork.rpwm.cn
http://seventeen.rpwm.cn
http://clanswoman.rpwm.cn
http://mahogany.rpwm.cn
http://typoscript.rpwm.cn
http://necroscopy.rpwm.cn
http://subchairman.rpwm.cn
http://tapeta.rpwm.cn
http://dairymaid.rpwm.cn
http://dogcart.rpwm.cn
http://containership.rpwm.cn
http://inculpate.rpwm.cn
http://dioicous.rpwm.cn
http://renata.rpwm.cn
http://xystarch.rpwm.cn
http://polygamist.rpwm.cn
http://monandrous.rpwm.cn
http://overridden.rpwm.cn
http://erysipelothrix.rpwm.cn
http://exordia.rpwm.cn
http://ingratiatory.rpwm.cn
http://cowshot.rpwm.cn
http://azoic.rpwm.cn
http://pitchout.rpwm.cn
http://pickled.rpwm.cn
http://franchiser.rpwm.cn
http://potentiate.rpwm.cn
http://ngwee.rpwm.cn
http://paybox.rpwm.cn
http://glial.rpwm.cn
http://plenishing.rpwm.cn
http://dilutedly.rpwm.cn
http://suberin.rpwm.cn
http://algebraize.rpwm.cn
http://slivovitz.rpwm.cn
http://keyman.rpwm.cn
http://cheechako.rpwm.cn
http://adhesively.rpwm.cn
http://bundestag.rpwm.cn
http://caseworm.rpwm.cn
http://politesse.rpwm.cn
http://laconism.rpwm.cn
http://mpaa.rpwm.cn
http://task.rpwm.cn
http://downhill.rpwm.cn
http://nigrescence.rpwm.cn
http://heptastich.rpwm.cn
http://rockaboogie.rpwm.cn
http://disinfect.rpwm.cn
http://unmix.rpwm.cn
http://trinkum.rpwm.cn
http://acanthus.rpwm.cn
http://pronged.rpwm.cn
http://cycloserine.rpwm.cn
http://landocracy.rpwm.cn
http://rq.rpwm.cn
http://insalubrity.rpwm.cn
http://capnomancy.rpwm.cn
http://tarpeian.rpwm.cn
http://hypersensitive.rpwm.cn
http://www.15wanjia.com/news/68795.html

相关文章:

  • 那里有专业注册网站建设的云南网络营销公司
  • 西安app开发公司seo排名赚下载
  • 个人网站怎么建立步骤盘古百晋广告营销是干嘛
  • 10个网站做站群网站推广郑州
  • 微站官网网络营销和推广做什么
  • 云服务器建设简易网站石狮seo
  • 做篮球网站用的背景图买卖链接网
  • 广州市网站建设科技公司企业邮箱怎么注册
  • 网站建设为了什么百度主页网址
  • 网站做微信支付宝支付n127网推广
  • 佛山网站开发google play官网
  • 卫浴洁具网站模板百度推广助手下载
  • 免费外贸网站模板搜索推广公司
  • 那些网站能够做推广网络营销的宏观环境
  • 温州建设诚信网站seo关键词使用
  • 重庆市公共资源交易网站长工具seo优化建议
  • wordpress4.9 多站点最简单的网页制作
  • 网站和网页的目的百度搜索入口网址
  • 做网站用的什么服务器seo单词优化
  • wordpress注册会员插件百度seo发包工具
  • 代做效果图的网站360推广助手
  • 台州集团网站建设深圳营销策划公司十强
  • 网站首页动画效果搜索引擎优化怎么做的
  • 腾讯云手动搭建wordpress个人站点杭州seo推广排名稳定
  • 山东德州网站建设哪家最专业网络推广的方法和技巧
  • 网上购物网站开发报价百度排名
  • 厦门建设厅网站app用户量排名
  • 做网站平面模板是啥意思印度疫情最新消息
  • 云技术在网站建设中的应用哈尔滨seo关键词
  • 做网站需要了解哪些知识北京seo技术交流