• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#Task总结(异步操作+并行)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

任务Task与线程Thread不可比。Task是为了利用多CPU多核的机制而将一个大任务不断分解成小任务,这些任务具体由哪一个线程或当前线程执行由OS来决定。如果你想自己控制由哪一个Thread执行,要么自己定议task的scheduling, 要么自己来创建Thread来执行代码。

1)task是根据自己需要调用线程

2)thread就是个基本单位

简单地du说,thread是单核多线程,task是多核多线程

 /// <summary>
 /// 简单的task创建方式演示
 /// </summary>
 private static void TaskCreatFun()
 {
     // 其一、通过传统的 new 方式来实例化一个task对象,这种方式需要手动通过start来启动
     Task newTask = new Task(() =>
     {
         Thread.Sleep(1000);
         Console.WriteLine($"Hello Engineer, 我是 new 的一个task,线程ID:Thread.CurrentThread.ManagedThreadId}");
     });

     // 启动 tsak
     newTask.Start();

     // 其二、通过工厂 factory 来生成一个task对象,并自启动
     Task factoryTask = Task.Factory.StartNew(() =>
     {
         Thread.Sleep(1000);
         Console.WriteLine($"Hello Engineer, 我是 factory 生产 的一个task,线程ID:Thread.CurrentThread.ManagedThreadId}");
     });

     // 其三、通过 Task.Run(Action action) 来创建一个自启动task
     Task runTask = Task.Run(() =>
     {
         Thread.Sleep(1000);
         Console.WriteLine($"Hello Engineer, 我是 Task.Run 创建一个自启动task,线程ID:Thread.CurrentThread.ManagedThreadId}");
     });
     runTask.RunSynchronously();

     Console.WriteLine($"Hello Engineer, 我是主线程啦!线程ID{Thread.CurrentThread.ManagedThreadId}");
 }

  Task回调

  a.某一个任务结束回调

 taskList.Add(taskFactory.StartNew(() => this.DoSomethingLong("btnTask_Click_002")));
 taskList.Add(taskFactory.StartNew(() => this.DoSomethingLong("btnTask_Click_001")));
 //回调ContinueWhenAny没有那么精准,不一定是在某个线程完成之后发生
 taskList.Add(taskFactory.ContinueWhenAny(taskList.ToArray(), t =>      Console.WriteLine($"ContinueWhenAny {Thread.CurrentThread.ManagedThreadId.ToString("00")}")));

  b.所有任务结束回调

taskList.Add(taskFactory.ContinueWhenAll(taskList.ToArray(), tList => Console.WriteLine($"这里是ContinueWhenAll {Thread.CurrentThread.ManagedThreadId.ToString("00")}")));

  c.单个任务结束回调

Task task2 = taskFactory.StartNew(t => this.DoSomethingLong("btnTask_Click_005"), "煎饼果子").ContinueWith(t => Console.WriteLine($"这里是{t.AsyncState}的回调"));

  Task等待

Task.WaitAny(taskList.ToArray());//卡界面

Task.WaitAll(taskList.ToArray());//卡界面

  Task获取返回结果

Task<int> intTask = taskFactory.StartNew(() => 123);
int iResult = intTask.Result;
Task<string> intTask = taskFactory.StartNew(() => "123");
int iResult = intTask.Result;

  Task同步执行

可以用task.RunSynchronously() 来同步执行,但是这种方式执行,只有通过new 实例化的task才有效,原因也很简单,其他两种方式创建task都已经自启动执行了,不可能在来一个同步启动执行吧。

也可以通过task.wait()来变相的实现同步执行效果,当然也可以用task.Result来变现的实现,原理很简单,因为wait()和Result都是要阻塞主流程,直到task执行完毕

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#中的委托和事件(续)发布时间:2022-07-13
下一篇:
C#开发COM组件2发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap