xml地图|网站地图|网站标签 [设为首页] [加入收藏]

多线程之取消架构

来源:http://www.ccidsi.com 作者:呼叫中心培训课程 人气:115 发布时间:2019-05-22
摘要:.NET 四.5中隐含撤销架构,允许以专门的工作方法收回长日子运作的天职。每一种阻塞调用都应援救这种体制。但最近,并不是独具阻塞调用都落到实处了那一个新本事。已经落到实处了

  .NET 四.5中隐含撤销架构,允许以专门的工作方法收回长日子运作的天职。每一种阻塞调用都应援救这种体制。但最近,并不是独具阻塞调用都落到实处了那一个新本事。已经落到实处了这种体制的本领有任务(),并发集合类(),并行LINQ()和几种共同机制。

二十八线程之撤销架构,二十四线程框架结构

  .NET 四.5中富含撤除架构,允许以正规化措施收回长日子运作的职分。每一个阻塞调用都应援助这种体制。但最近,并不是怀有阻塞调用都落到实处了这些新本事。已经完结了这种体制的技术有职务(

  打消架构基于合营行为,它不是挟持的。长日子运作的职分会检讨它是或不是被打消,并再次来到调整权。

  扶助撤废的秘籍接受贰个CancellationToken参数。那些类定义了IsCancellationRequested属性,在那之中长日子运作的操作可以检查它是否应甘休。使用Register()方法注册二个就要撤废此 System.Threading.CancellationToken 时调用的信托。它在调用Cancel()方法撤除操作时调用。

1.Parallel.For()方法的撤销

  Parallel类提供了For()方法的重载版本,在重载版本中,能够传递ParallelOptions类型的参数。使用ParallelOptions类型,能够传递一个CancellationToken参数。CancellationToken参数通过创造CancellationTokenSource来扭转。由于CancellationTokenSource完毕了ICancelableOperation接口,由此能够用CancellationToken注册,并同意选择Cancle(),CancleAfter()等措施撤销操作。
  示例:

    static void CancelParallelFor()
        {
            var cts = new CancellationTokenSource();
            cts.Token.Register( ()=> Console.WriteLine("token canceled!"));

            cts.CancelAfter(1000);

            try
            {
                ParallelLoopResult plr =
                    Parallel.For(0, 100, new ParallelOptions { CancellationToken = cts.Token },
                    x => {
                        Console.WriteLine("loop {0} started", x);
                        Thread.Sleep(1000);
                        Console.WriteLine("loop {0} fininshed!", x);
                    });
            }
            catch (OperationCanceledException ex)
            {
                Console.WriteLine(ex.Message);

            }
        }

  输出:
  图片 1

  在For循环的完成代码中,Parallel类验证CancellationToken的结果,并撤消操作。1旦撤消操作,For()方法就抛出3个OperationCanceledException类型的极度。

  由输出可看到,当取消操作时,已开行的操作允许达成,因为撤废操作总是以合作方法开展,以幸免在撤除迭代操作的中间走漏财富。

二.义务的撤消

  职分的打消类似Parallel.For()方法的撤除。首先,成立贰个CancellationTokenSource。假若只必要三个注销标识,可以访问Task.Factory.CancellationToken,以利用暗许的撤销标志。任务通过TaskFactory对象接受打消标志。在构造函数中,把撤销标记赋予TaskFactory。那些撤除标志又职分用于检查CancellationToken的IsCancellationRequested属性,以鲜明是或不是请求了撤除。
  示例:

    static void CancelTask()
        {
            var cts = new CancellationTokenSource();

            cts.Token.Register(() => Console.WriteLine("task cancelled!"));

            cts.CancelAfter(2000);



            try
            {
                Task t = Task.Run(() =>
                {
                    CancellationToken token = cts.Token;
                    Console.WriteLine("task stared!");
                    for (int i = 0; i < 20; i  )
                    {
                        Thread.Sleep(500);
                        if (cts.IsCancellationRequested)
                        {
                            Console.WriteLine("cancelled!");
                            token.ThrowIfCancellationRequested();//抛出异常
                            break;
                        }
                        Console.WriteLine("in loop!");
                    }
                }, cts.Token);
                t.Wait();
            }
            catch (AggregateException ex)
            {
                Console.WriteLine("exception:{0},{1}",ex.GetType().Name,ex.Message);
                foreach (var innerEx in ex.InnerExceptions)
                {
                    Console.WriteLine("exception:{0},{1}", ex.InnerException.GetType().Name, ex.InnerException.Message);
                }
            }
        }

 

  输出:
  图片 2

.NET 四.5中带有撤销架构,允许以标准措施收回长日子运作的职责。每一种阻塞调用都应帮助这种机制。但近日...

  撤废架构基于合作行为,它不是勒迫的。长日子运作的职务会检讨它是不是被撤废,并赶回调整权。

  援救撤废的点子接受二个CancellationToken参数。那些类定义了IsCancellationRequested属性,在那之中长日子运作的操作能够检查它是或不是应甘休。使用Register()方法注册一个就要打消此 System.Threading.CancellationToken 时调用的嘱托。它在调用Cancel()方法撤销操作时调用。

1.Parallel.For()方法的打消

  Parallel类提供了For()方法的重载版本,在重载版本中,能够传递ParallelOptions类型的参数。使用ParallelOptions类型,能够传递贰个CancellationToken参数。CancellationToken参数通过创建CancellationTokenSource来扭转。由于CancellationTokenSource达成了ICancelableOperation接口,因而可以用CancellationToken注册,并允许行使Cancle(),CancleAfter()等办法撤消操作。
  示例:

    static void CancelParallelFor()
        {
            var cts = new CancellationTokenSource();
            cts.Token.Register( ()=> Console.WriteLine("token canceled!"));

            cts.CancelAfter(1000);

            try
            {
                ParallelLoopResult plr =
                    Parallel.For(0, 100, new ParallelOptions { CancellationToken = cts.Token },
                    x => {
                        Console.WriteLine("loop {0} started", x);
                        Thread.Sleep(1000);
                        Console.WriteLine("loop {0} fininshed!", x);
                    });
            }
            catch (OperationCanceledException ex)
            {
                Console.WriteLine(ex.Message);

            }
        }

  输出:

  图片 3

本文由68399皇家赌场发布于呼叫中心培训课程,转载请注明出处:多线程之取消架构

关键词: 68399皇家赌场

上一篇:python迭代器与生成器,迭代器和生成器

下一篇:没有了

最火资讯