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

定一个不同的异步操作

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点睡觉的

转载于:https://my.oschina.net/objectboy/blog/898043

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值