.Net Cancellable Task

概述

.NET基于委托的APM(Asynchronous Programming Model)模型通过BeginInvoke, EndInvoke, AsyncCallback,IAsyncResult的组合使用,让程序员可以方便的进行异步调用、异步回调和同步等待等操作。但.NET平台还没有为线程的中止(abort)提供安全可靠的机制,也许正是基于这个原因APM并没有包含异步调用的超时机制,而是把这个可能引起争议的工作交给使用者自己来把握。

作为APM模型的补充,本文通过CancellableTask类提供了一个异步调用超时机制。CancellableTask类的设计有两个主要的考虑:

1.保持APM风格,使用者依然可以使用熟悉的BeginInvoke, EndInvoke, IAsyncResult, AsyncCallback等;

2.提供基于Thread.Abort的默认超时处理,同时支持用户自定义cancel回调。

使用

CancellableTask的构造函数包含workCallbak和cancelCallback(可选)两参数,分别对应work回调和cancel回调。CancellableTask的BeginInvoke保持了APM的风格,可以看作是增加了timeout参数(单位:ms)的扩展版;而EndInvoke,AsyncCallback以及IAsyncResult的使用都和APM保持一致。Work委托产生的异常会在EndInvoke时抛出,同时若线程被超时中止,EndInvoke则会抛出ThreadAbortException异常。

下面是一段CancellableTask的使用示例:

class Program
{
    static void Main(string[] args)
    {
        //默认超时直接abort线程
        {
            Console.WriteLine("[case 1]");
            CancellableTask cancellableTask = new CancellableTask(Work);
            State arg = new State { Loop = 20, Stop = false };
            IAsyncResult asyncResult = cancellableTask.BeginInvoke(
                arg,
                (ar => Console.WriteLine("Async Callback")),
                null,
                10 * 1000);
            asyncResult.AsyncWaitHandle.WaitOne();
            try
            {
                object r = cancellableTask.EndInvoke(asyncResult);
                Console.WriteLine("return " + r);
            }
            catch (ThreadAbortException)
            {
                Console.WriteLine("Thread Aborted");
            }
            catch (Exception exp)
            {
                Console.WriteLine(exp.ToString());
            }
        }
        //自定义Cancel回调
        {
            Console.WriteLine(Environment.NewLine + "[case 2]");
            CancellableTask cancellableTask = new CancellableTask(Work, Cancel);
            State arg = new State { Loop = 20, Stop = false };
            IAsyncResult asyncResult = cancellableTask.BeginInvoke(
                arg,
                (ar =>
                    {
                        try
                        {
                            object r = cancellableTask.EndInvoke(ar);
                            Console.WriteLine("return " + r);
                        }
                        catch (ThreadAbortException)
                        {
                            Console.WriteLine("Thread Aborted");
                        }
                        catch (Exception exp)
                        {
                            Console.WriteLine(exp.ToString());
                        }
                    }
                ),
                arg,
                10 * 1000);
        }
        Console.ReadLine();
    }
    static object Work(object arg)
    {
        State state = arg as State;
        int i;
        for (i = 0; i < state.Loop; i++)
        {
            if (state.Stop) break;
            Console.WriteLine(i);
            Thread.Sleep(1000);
        }
        return i;
    }
    static void Cancel(object state)
    {
        State st = state as State;
        st.Stop = true;
    }
}
internal class State
{
    public int Loop { get; set; }
    public bool Stop { get; set; }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索console
, 超时机制
, state
, stopped working
, IAsyncResult
, WriteLine
cancel
.net task、asp.net task、asp.net mvc task、.net task 异步、.net 4.0 task,以便于您获取更多的相关知识。

时间: 2024-09-15 02:17:24

.Net Cancellable Task的相关文章

Task Scheduler 介绍

Task Scheduler 的描叙:使用户可以在此计算机上配置和计划自动任务,此服务还托管多个Windows系统关键任务.如果此服务被停止或禁用,这些任务将无法再按计划的时 间运行.如果此服务被禁用,则明确依赖它的所有服务将无法启动.这个命令有点类似于Linux下的crontab 等后台命令.可以通过它在Window 平台自动备份数据库等任务.这个命令依赖于Remote Procedure Call(RPC)系统组件(Windows XP/2000/2003下), 在VISTA.WIN7下必须

Timer Task 的简单范例(相当触发器,转自Sun)

触发器 Scheduling a Timer Task to Run at a Certain Time============================================== Date timeToRun =    new Date(System.currentTimeMillis()+   numberOfMillisecondsInTheFuture); Timer timer = new Timer();      timer.schedule(new TimerTa

如何使用 Multicast Task 将数据同时写入多个目标表

开篇介绍 在 SSIS Data Flow 中有一个 Multicast 组件,它的作用和 Merge, Merge Join 或者 Union All 等合并数据流组件对比起来作用正好相反.非常直观,它可以将一个数据流平行分开成为多个数据流供下游其它 Data Flow 组件使用. 使用 Multicast Task 的几种情形 第一种,从同一个数据源中取出一部分数据直接放到 A 表中,一部分数据直接放到 B 表中.我曾经遇到一个370多列的一个文件,这370列的文件可以分出列数不等的7,8

hive如何关闭task推测执行

前几天在解决同事一个Hive Bug的时候,需要关闭task推测执行(speculative execution), 在网上查了资料后有人提到需要 set hive.mapred.map.tasks.speculative.execution=false set hive.mapred.reduce.tasks.speculative.execution=false 但是执行后发现job 还是启动speculative task,有点奇怪,明明设置了啊. 找到hive对应的代码,发现只有hive

Map/Reduce Task JVM堆的大小设置优化

前一阵子发现用户提交的hive query和hadoop job会导致集群的load非常高,经查看配置,发现很多用户擅自将mapred.child.java.opts设置的非常大,比如-Xmx4096m(我们默认设置是-Xmx1024m),  导致了tasktracker上内存资源耗尽,进而开始不断swap磁盘上数据,load飙升 TaskTracker在spawn一个map/reduce task jvm的时候,会根据用户JobConf里面的值设定jvm的参数,然后写入一个taskjvm.sh

监听器初始化Job,JobTracker相应TaskTracker心跳,调度器分配task分析

监听器初始化Job,JobTracker相应TaskTracker心跳,调度器分配task的源码级分析 JobTracker和TaskTracker分别启动之后(JobTracker启动流程源码级分析,TaskTracker启动过程源码级分析),taskTracker会通过心跳与JobTracker通信,并获取分配它的任务.用户将作业提交到JobTracker之后,放入相应的数据结构中,静等被分配.mapreduce job提交流程源码级分析(三)这篇文章已经分析了用户提交作业的最后步骤,主要是

SSIS:理解Data Flow Task 中的同步与异步等概念

理解Data Flow Task 中的同步与异步, 阻塞,半阻塞和全阻塞以及Buffer 缓存概念 在 SSIS Dataflow 数据流中的组件可以分为 Synchronous 同步和 Asynchronous 异步这两种类型. Synchronous 同步组件 同步组件有一个非常重要的特征 - 同步组件的输出和它的输入共享同一个缓存,即输入多少行数据 输出就多少行数据.在同步转换的过程中,输入一行,输出一行,输入与输出同步,它们同时发生. Asynchronous 异步组件 异步组件的特征就

SSSIS:在 SSIS 中使用 Multicast Task 将数据源数据同时写入多个目标表

在 SSIS 中使用 Multicast Task 将数据源数据同时写入多个目标表,以及写入Audit 与增量处理信息 在 SSIS Data Flow 中有一个 Multicast 组件,它的作用和 Merge, Merge Join 或者 Union All 等合并数据流组件对比起来作用正好相反,非常直观,它可以将一个数据流平行分开成为多个数据流供 下游其它 Data Flow 组件使用. 首先描述一下使用 Multicast Task 的几种情形  - 第一种,从同一个数据源中取出一部分数

一起学Windows Phone7开发(十四.五 Market Task)

这个Task就是可以启动MarketPlace客户端程序,并且可以按设置显示应用.可以说MarketPlace是WP7的重中之重,因为只有通过它才可以安装应用程序,开 发者的程序也才可以下发到手机上. 1.MarketplaceHubTask:启动客户端程序,并按设置的分类显示应用. MarketplaceHubTask hub = new MarketplaceHubTask(); hub.ContentType = MarketplaceContentType.Applications; h