文档章节

要出去找工作了, 复习下任务并行之异步操作

开源中国123456789
 开源中国123456789
发布于 2017/05/12 10:56
字数 558
阅读 10
收藏 0

定一个不同的异步操作

static void Main(string[] args)
        {
            var task1 = new Task(new Action(TaskMethod));
            task1.Start();

            var task2 = new Task(delegate
            {
                TaskMethod();
            });
            task2.Start();

            var task3 = new Task(() => TaskMethod());
            task3.Start();


            var task4 = Task.Factory.StartNew(() =>
            {
                TaskMethod();
            });
            Console.ReadLine();
        }

        private static void TaskMethod()
        {
            Console.WriteLine("Hello World");
        }

上面有四种方式, 当然这只是语法糖的事, 效果都是一样的, 如果不用factory就的手动Start一个异步任务

取消任务操作任务

1,通知 System.Threading.CancellationToken,告知其应被取消。 var cancellationTokenSource = new CancellationTokenSource();

2,获取与此 System.Threading.CancellationTokenSource 关联的 System.Threading.CancellationToken var cancellationToken = cancellationTokenSource.Token;

var cancellationTokenSource = new CancellationTokenSource();
            var cancellationToken = cancellationTokenSource.Token;

            var task1 = new Task(new Action(TaskMethod), cancellationToken);
            //启动 System.Threading.Tasks.Task,并将它安排到当前的 System.Threading.Tasks.TaskScheduler
            task1.Start();
            Console.WriteLine("一个异步操作已经执行");

            cancellationTokenSource.Cancel();

            var result = cancellationTokenSource.IsCancellationRequested
                ? "异步操作已经被取消"
                : "异步操作还没有取消";
            Console.WriteLine(result);
            Console.ReadLine();

结果如下:

输入图片说明

注意, 并不是task1.Start();就马上要执行里面的异步了,就上面代码来说而是你操作完之后才调用你异步操作的方法.

** 取消异步操作 **

 var cancellationTokenSource = new CancellationTokenSource();
            var cancellationToken = cancellationTokenSource.Token;

            var task1 = new Task(() =>
            {
                for (var i = 0; i < int.MaxValue; i++)
                {
                    if (cancellationTokenSource.IsCancellationRequested)
                    {
                        Console.WriteLine("异步操作已经被取消");
                        throw new OperationCanceledException(cancellationToken);
                    }
                    else
                    {
                        Console.WriteLine("int values {0}", i);
                    }
                }
            }, cancellationToken);
            Console.WriteLine("按enter开始异步操作");
            Console.ReadLine();
            task1.Start();
            Console.WriteLine("再次按enter键来取消任务");
            Console.ReadLine();
            cancellationTokenSource.Cancel();
            Console.WriteLine("异步操作完成.");
            Console.ReadLine();

通过cancellationTokenSource.IsCancellationRequested来监测是否已经取消了, 如果取消了就抛出 throw new OperationCanceledException(cancellationToken); 监测取消的方式有很多中, 不过感觉知道一种就够了 , 请原谅我偷懒, 最近事太多了

**休眠异步操作 **

var cancellationTokenSource = new CancellationTokenSource();
            var cancellationToken = cancellationTokenSource.Token;

            var task1 = new Task(() =>
            {
                for (var i = 0; i < int.MaxValue; i++)
                {
                    var cancel = cancellationToken.WaitHandle.WaitOne(10000);
                    if (cancel)
                    {
                        throw new OperationCanceledException(cancellationToken);
                    }
                }
            }, cancellationToken); 
            task1.Start();
            Console.WriteLine("再次按enter键来取消任务");
            Console.ReadLine();
            cancellationTokenSource.Cancel();
            Console.WriteLine("异步操作完成.");
            Console.ReadLine();

cancellationToken.WaitHandle.WaitOne(10000); 休眠10秒,或者还是原来的套路 Thread.Sleep(10000);

等待一个异步操作执行完再执行下一个异步

  var task1 = new Task(new Action(TaskMethod));
            task1.Start();

            var task2 = new Task(delegate
            {
                TaskMethod();
            });
            task2.Start();

            var task3 = new Task(() => TaskMethod());
            task3.Start();


            var task4 = Task.Factory.StartNew(() =>
            {
                TaskMethod();
            });

            Task.WaitAll(task1, task2, task3, task4);

https://msdn.microsoft.com/zh-cn/library/system.threading.tasks.task(v=vs.110).aspx 不说了撤退了 , 昨晚3点睡觉的

© 著作权归作者所有

共有 人打赏支持
开源中国123456789
粉丝 7
博文 77
码字总数 66184
作品 0
海淀
私信 提问
ZStack 的伸缩性秘密(第一部分)异步架构

ZStack 核心架构设计使得 99% 的任务异步执行,因此确保了单个的管理节点能够管理十万级的物理服务器,百万级的虚拟机,数万级的并行任务。 架构的创新动力 对于要管理大量的硬件和虚拟机的...

oschina
2015/04/16
4.5K
5
《C#并发编程经典实例》学习笔记-第一章并发编程概述

并发编程的术语 并发 同时做多件事情 多线程 并发的一种形式,它采用多个线程来执行程序。 多线程是并发的一种形式,但不是唯一的形式。 并行处理 把正在执行的大量的任务分割成小块,分配给...

repeatedly
2018/08/18
0
0
C#:异步编程和线程的使用(.NET 4.5 )

异步编程和线程处理是并发或并行编程非常重要的功能特征。为了实现异步编程,可使用线程也可以不用。将异步与线程同时讲,将有助于我们更好的理解它们的特征。 本文中涉及关键知识点 1. 异步...

葡萄城控件技术团队
2015/06/09
0
1
iOS 多线程总结:GCD的使用

进程与线程 进程就是一个应用程序在处理机上的一次执行过程,它是一个动态的概念,而线程是进程中的一部分,进程包含多个线程在运行。 线程是指进程内的一个执行单元,也是进程内的可调度实体...

朱敏_ITer
2017/10/08
0
0
关于 ES6 中 Promise 的面试题

说明 最近在复习 Promise 的知识,所以就做了一些题,这里挑出几道题,大家一起看看吧。 题目一 解析 首先 Promise 新建后立即执行,所以会先输出 1,2,而 内部的代码在 当次 事件循环的 结...

FEWY
2018/10/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

租房软件隐私保护如同虚设

近日,苏州市民赵先生向江苏新闻广播新闻热线025-84658888反映,他在“安居客”手机应用软件上浏览二手房信息,并且使用该软件自动生成的虚拟号码向当地一家中介公司进行咨询。可电话刚挂不久...

linux-tao
今天
1
0
分布式项目(五)iot-pgsql

书接上回,在Mapping server中,我们已经把数据都整理好了,现在利用postgresql存储历史数据。 iot-pgsql 构建iot-pgsql模块,这里我们写数据库为了性能考虑不在使用mybatis,换成spring jd...

lelinked
今天
4
0
一文分析java基础面试题中易出错考点

前言 这篇文章主要针对的是笔试题中出现的通过查看代码执行结果选择正确答案题材。 正式进入题目内容: 1、(单选题)下面代码的输出结果是什么? public class Base { private Strin...

一看就喷亏的小猿
今天
2
0
cocoapods 用法

cocoapods install pod install 更新本地已经install的仓库 更新所有的仓库 pod update --verbose --no-repo-update 更新制定的仓库 pod update ** --verbose --no-repo-update...

HOrange
今天
3
0
linux下socket编程实现一个服务器连接多个客户端

使用socekt通信一般步骤 1)服务器端:socker()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接。 2)客户端:socker()建立套接字,连接(connect)服务器,连接上后...

shzwork
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部