如标题,这是.net发展异步的一个路线

记录下备忘起来

 线程(Thread)

Thread thread = new Thread(new ThreadStart(Method));//threadStart创建多线程(无参数)---〉 thread.Start();//执行

Thread thread = new Thread(new ParameterizedThreadStart(Method)); //ParameterizedThreadStart 帮顶有参数的异步方法----〉thread.Start(参数)

Thread有一个属性IsBackground,通过把此属性设置为true,就可以把线程设置为后台线程,thread.start方法启动默认是前台线程。

Thread.Abort()终止线程并引发 ThreadAbortException异常,Thread.ResetAbort()方法取消终止,继续执行。

 线程池(ThreadPool)

分工作者线程和I/O线程

ThreadPool线程池中包含有两个静态方法可以直接启动工作者线程:
一为 ThreadPool.QueueUserWorkItem(WaitCallback)
二为 ThreadPool.QueueUserWorkItem(WaitCallback,Object)

先把WaitCallback委托指向一个带有Object参数的无返回值方法,再使用 ThreadPool.QueueUserWorkItem(WaitCallback) 就可以异步启动此方法,此时异步方法的参数被视为null 。 object对象作为参数传送到回调函数中

委托是最灵活的工作者线程,见委托时间介绍

 task(基于任务的编程模型,简化了异步开发,比线程性能优越,任务调用了更低限度的线程池,可以替代老旧thread,但它同工作者线程池一样不适合运行较长时间的任务,如果需要的话则使用任务工厂的longrunning选项,即可告诉任务调度一个新的线程,类似直接new thread不鸟线程池)

//第一种方式开启,created状态,任务在这个状态时才能使用start()方法让任务进入排队运行,就是第二种方式。

2         var task1 = new Task(() =>
3         {
4             Run1();
5         });

//第二种方式开启,直接跳过第一步created状态,进入等待运行状态
var task2 = Task.Factory.StartNew(() =>
2             {
3                 Run2();
4             });

Task.WaitAll(task1, task2);//并行执行

取消标记”叫做CancellationTokenSource.Token,在创建task的时候传入此参数,就可以将主线程和任务相 关联,然后在任务中设置“取消信号“叫做ThrowIfCancellationRequested来等待主线程使用Cancel来通知,一旦cancel被调用。task将会 抛出OperationCanceledException来中断此任务的执行,最后将当前task的Status的IsCanceled属性设为true。

获取返回值 

这里t1任务执行完毕后,使用continuewith开始第二个任务(回调另一个方法),因为task并没有提供回调事件。

//获取返回值第一种task<T>
var t1 = Task.Factory.StartNew<List<string>>(() => { return Run1(); });
t1.Wait();t1.result

//获取返回值第二种
var t1 = Task.Factory.StartNew<List<string>>(() => { return Run1(); });

var t2 = t1.ContinueWith((i) =>  //Continuewith 串行执行,waitall并行执行
         {
             Console.WriteLine("t1集合中返回的个数:" + string.Join(",", i.Result));
         });

async/await (简化异步操作,不需要回掉函数而是用顺序编程)

// Signature specifies Task<TResult>

async Task<int> TaskOfTResult_MethodAsync()
{
    int hours;
    // . . .
    // Return statement specifies an integer result.
    return hours;
}

// Calls to TaskOfTResult_MethodAsync
Task<int> returnedTaskTResult = TaskOfTResult_MethodAsync();
int intResult = await returnedTaskTResult;
// or, in a single statement
int intResult = await TaskOfTResult_MethodAsync();

// Signature specifies Task
async Task Task_MethodAsync()
{
    // . . .
    // The method has no return statement.  
}

// Calls to Task_MethodAsync
Task returnedTask = Task_MethodAsync();
await returnedTask;
// or, in a single statement
await Task_MethodAsync();

任务工厂 static void Main(string[] args        {

            CancellationTokenSource cts = new CancellationTokenSource();//cts可以共享给任务工厂,同时取消一组任务TaskFactory taskFactory = new TaskFactory();Task[] tasks = new Task[]{taskFactory.StartNew(() => Add(cts.Token)),taskFactory.StartNew(() => Add(cts.Token)),taskFactory.StartNew(() => Add(cts.Token))};//CancellationToken.None指示TasksEnded回调不能被取消taskFactory.ContinueWhenAll(tasks, TasksEnded, CancellationToken.None);Console.ReadKey();//等待按键取消任务cts.Cancel();Console.ReadKey();}static void TasksEnded(Task[] tasks){Console.WriteLine("所有任务已完成!");}

 static int Add(CancellationToken ct) { Console.WriteLine("任务开始……");
int result =0;
while (!ct.IsCancellationRequested) { result++; Thread.Sleep(1000); } return result; } 

下面是父子任务模式

using System;
using System.Threading;
using System.Threading.Tasks;
public class Program {private static Int32 Sum(Int32 n){Int32 sum = 0;for (; n > 0; n--)checked { sum += n; } return sum;}public static void Main() {Task<int32[]> parent = new Task<int32[]>(() => {var results = new Int32[3];   // 创建一个数组存储结果// 创建三个子任务,并进入执行状态new Task(() => results[0] = Sum(100), TaskCreationOptions.AttachedToParent).Start();new Task(() => results[1] = Sum(200), TaskCreationOptions.AttachedToParent).Start();new Task(() => results[2] = Sum(300), TaskCreationOptions.AttachedToParent).Start();// 返回结果集return results;});//当父子任务都执行完毕后,显示结果。这句比较重要,为parent增加了回掉,对parent的结果parentTask.Result==results进行循环显示
        var cwt = parent.ContinueWith(parentTask => Array.ForEach(parentTask.Result, Console.WriteLine));// 开始父任务,子任务将会执行
        parent.Start();cwt.Wait(); // 测试等待回掉效果
    }
}

转载于:https://www.cnblogs.com/zfcflower/archive/2012/11/29/2794021.html

线程--线程池--委托--task---async/await相关推荐

  1. @async 默认线程池_.NET Web应用中为什么要使用async/await异步编程?

    布莱恩特:.NET Core开发精选文章目录,持续更新,欢迎投稿!​zhuanlan.zhihu.com 前言 1.什么是async/await? await和async是.NET Framework ...

  2. C#多线程编程(1)--线程,线程池和Task

    C#多线程编程(1)--线程,线程池和Task 新开了一个多线程编程系列,该系列主要讲解C#中的多线程编程.    利用多线程的目的有2个: 一是防止UI线程被耗时的程序占用,导致界面卡顿:二是能够利 ...

  3. async spring 默认线程池_SpringBoot中Async异步方法和定时任务介绍

    1.功能说明 Spring提供了Async注解来实现方法的异步调用.即当调用Async标识的方法时,调用线程不会等待被调用方法执行完成即返回继续执行以下操作,而被调用的方法则会启动一个独立线程来执行此 ...

  4. python async await threading_Python - 从使用线程到使用 async/await

    async/await 是一种异步编程方法,还有两种你可能听过,1. 回调 2. Promise (写过 JavaScript 的肯定很熟悉了) 异步意味着任务不会阻塞,比如,如果我要下载一个比较忙的 ...

  5. 多线程-Task、await/async

    Task创建无返回值 Task是.netframwork4.0重新分装的多线程类.原因以前的多线程(thread threadpool)不好用.(.net framwork也是的发展的,现在的EF,刚 ...

  6. 【转】异步编程系列(Thread、Task、async/await、ajax等)

    序 经过一番努力,我写的异步编程系列也算有头有尾,当然不是说这个系列已经更新完毕,这个头尾只是表示新旧知识点都有简单涉及到,接下去我还会丰富这一系列并且有机会整个小应用(愿景是弄一个开源组件吧,结合s ...

  7. Task和async/await详解

    一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...

  8. C#多线程和异步(二)——Task和async/await详解

    一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...

  9. 【转】Task和async/await详解

    一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...

最新文章

  1. Java中的回调函数学习-深入浅出
  2. 自学python可以找到好的工作吗-27岁0基础自学Python,多久可以找到工作?
  3. Git - 使用指南
  4. iOS 开发中需要注意的小地方
  5. AAAI 2019 《LiveBot: Generating Live Video Comments Based on Visual and Textual Contexts》论文笔记
  6. linux下邮件查看命令
  7. 假如一种编程语言代表一个国家,哎哟,有意思了!
  8. 如何在优雅地Spring 中实现消息的发送和消费 1
  9. jsp - 9 内置对象application详解
  10. Android学习笔记——ProgressBarHandler
  11. 使用系统定时器SysTick实现精确延时微秒和毫秒函数
  12. HDFS中的NameNode和DataNode
  13. Vue安装步骤及教程(详细)
  14. 解决javax.persistence.EntityNotFoundException: Unable to find
  15. 凑数算法 c语言,算法题解 - 牛客编程巅峰赛S1第4场 - 黄金钻石组
  16. linux如何卸载光驱显示busy,执行umount 的时候却提示:device is busy 的处理方法 卸载挂载的盘提示如下...
  17. 机器学习基础(林軒田)笔记之七
  18. 开发中常用的几种 Content-Type以及图片上传前后端分离开发处理方式
  19. SpringAop_2通知(新手)和无法找到元素 'aop:aspectj-autoproxy' 的声明
  20. 【小程序开发原创】小程序裁剪图片上传头像,二维码源码

热门文章

  1. linux vi编辑撤销,vi撤销命令(u和U),撤销上一次的操作
  2. Bitmap如何高效加载图片
  3. 不容错过 DOCKERCON SF 2019 大会的 5 个理由
  4. PHP系统学习3 正则
  5. 消费分期群体-在校大学生和职场白领
  6. ORACLE RAC运行在300G内存以上需要考虑的东西
  7. flask+socketio+echarts3 服务器监控程序(基于后端数据推送)
  8. 移动大数据时代:无线网络的挑战与机遇
  9. 关于CSS一些细节问题
  10. 使用Pls_Integer的好处