必威体育Betway必威体育官网
当前位置:首页 > IT技术

任务,线程和同步(三)之取消架构

时间:2019-07-14 04:43:14来源:IT技术作者:seo实验室小编阅读:52次「手机版」
 

cancellation

取消架构

.NET4.5包含一个取消架构,允许以标准方式取消长时间运行的任务。每个阻塞调用都应支持这种机制。当然目前不是所有的阻塞都实现了这种新的技术,但越来越多的阻塞调用都支持它。已提供了这种机制的技术有任务,并发集合类,并行LINQ和几种同步机制。

取消架构基于协作行为,它不是强制的。长时间运行的任务会检查它是否被取消,并返回控制权。

支持取消的方法接受一个cancellationToken参数。这个类定义了IsCancellationrequestd属性,其中长时间运行的操作可以检查它是否应终止。

1.1parallel.For()方法的取消

    var cts = new CancellationTokenSource();
            cts.Token.Register(() => console.WriteLine("*** token canceled"));
            cts.CancelAfter(500);

            try
            {
                ParallelLoopResult result = Parallel.For(0, 100, new ParallelOptions()
                {

                    CancellationToken = cts.Token,
                }, x =>
                {
                    Console.WriteLine(" loop {0} started", x);
                    int sum = 0;
                    for (int i = 0; i < 100; i++)
                    {
                        Thread.Sleep(20);
                        sum += i;
                    }
                    Console.WriteLine("loop {0} finished", x);
                });
            }
            catch (OperationCanceledException ex)
            {

                Console.WriteLine(ex.message);
            }

运行应用程序,会得到如下结果,第0,25,50,75,1迭代启动,在一个有4个内核cpu系统运行。通过取消此操作,其他所有的迭代操作都在启动之前取消了。启动的迭代操作允许完成,因为取消操作总是以协作方式进行,以避免在取消迭代操作的中间泄露资源

这里写图片描述

2.任务取消

同样的取消模式也适用于任务。首先,新建一个CancellationTokenSource、如果仅需要一个取消标记,就可以访问Task.Factory.CancellationToken以使用默认的取消标记。

   private static void TRaskCancell()
        {
            var cts = new CancellationTokenSource();
            cts.Token.Register(() => Console.WriteLine("*** token canceled"));
            cts.CancelAfter(500);

            Task t1 = Task.Run(() => {
                Console.WriteLine("in task");
                for (int i = 0; i < 20; i++)
                {
                    Thread.Sleep(100);
                    CancellationToken token = cts.Token;
                    if (token.IsCancellationRequested)
                    {
                        Console.WriteLine("cancelling was requested"+"cancelling from within the task");
                        token.throwIfCancellationRequested();
                        break;
                    }
                    Console.WriteLine("in loop ");
                }
                Console.WriteLine("task finished without cancelation");

            },cts.Token);

            try
            {
                t1.Wait();
            }
            catch (AggregateException ex)
            {
                Console.WriteLine("exception:{0},{1}",ex.GetType().Name,ex.Message);
                foreach (var item in ex.InnerExceptions)
                {
                    Console.WriteLine("inner excetion:{0},{1}",ex.InnerException.GetType().Name,ex.InnerException.Message);
                }
            }

        }

运行应用程序,可以看到任务启动了,运行了几个循环,并获得了取消请求。之后取消任务,并抛出TaskCanceledException异常,它是从方法调用ThrowIfCancellationRequested()中启动。调用等待任务时,会捕获AggregateException异常,它还包含内部异常TaskCanceledException。

这里写图片描述

相关阅读

oncontextmenu 事件取消鼠标右键功能

<script type="text/javascript"> document.oncontextmenu=function(){return false}; </script>

PS磁性套索工具怎么后退或取消一个点

1. Delete,按一下就取消一个点。2. Backspace,按一下就取消一个点。3. Ctrl+Z,撤销上一步操作(慎选,算好要撤销哪些步骤)。4. 历史记录

excel表格取消密码保护的教程详解

Excel中加了密码的表格需要进行解密操作,解密具体该如何进行操作呢?下面是由seo实验室小编分享的excel表格取消密码保护的教程,以供

取消EXCEL2010密码的方法步骤详解

很多EXCEL档不想让别人随意看会加密,有时这个文档不再有机密了,每次输密码很麻烦,想取消密码,如何操作呢?下面小编来告诉你取消EXCEL2

取消新闻源后,再开放阿拉丁生态,百度是要做什么?

百度的阿拉丁平台主要用于百度内部为用户提供结构化的搜索结果,完善用户体验,而此次则正式宣布要对站长们进行全面开放,允许接入各大

分享到:

栏目导航

推荐阅读

热门阅读