文章导航PC6首页软件下载单机游戏安卓资源苹果资源

pc软件新闻网络操作系统办公工具编程服务器软件评测

安卓新闻资讯应用教程刷机教程安卓游戏攻略tv资讯深度阅读综合安卓评测

苹果ios资讯苹果手机越狱备份教程美化教程ios软件教程mac教程

单机游戏角色扮演即时战略动作射击棋牌游戏体育竞技模拟经营其它游戏游戏工具

网游cf活动dnf活动lol周免英雄lol礼包

手游最新动态手游评测手游活动新游预告手游问答

您的位置:首页技术开发.Net 专栏 → .Net Cancellable Task - APM异步超时机制扩展

.Net Cancellable Task - APM异步超时机制扩展

时间:2010/2/15 18:10:00来源:本站整理作者:我要评论(0)

.Net Cancellable Task - APM异步超时机制扩展:

  .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的使用示例:

classProgram
{
  staticvoidMain(string[]args)
  {
    //默认超时直接abort线程
    {
      Console.WriteLine("[case1]");
      CancellableTaskcancellableTask=newCancellableTask(Work);
      Statearg=newState{Loop=20,Stop=false};
      IAsyncResultasyncResult=cancellableTask.BeginInvoke(
        arg,
        (ar=>Console.WriteLine("AsyncCallback")),
        null,
        10*1000);
      asyncResult.AsyncWaitHandle.WaitOne();
      try
      {
        objectr=cancellableTask.EndInvoke(asyncResult);
        Console.WriteLine("return"+r);
      }
      catch(ThreadAbortException)
      {
        Console.WriteLine("ThreadAborted");
      }
      catch(Exceptionexp)
      {
        Console.WriteLine(exp.ToString());
      }
    }
    //自定义Cancel回调
    {
      Console.WriteLine(Environment.NewLine+"[case2]");
      CancellableTaskcancellableTask=newCancellableTask(Work,Cancel);
      Statearg=newState{Loop=20,Stop=false};
      IAsyncResultasyncResult=cancellableTask.BeginInvoke(
        arg,
        (ar=>
          {
            try
            {

相关视频

    没有数据

相关阅读 Win8下无法升级.NET Framework 3.5.1的解决方法Windows系统运行库集合下载 - VC运行库,.NET DirectX库vs.netIDE报"以下文件中的行尾不一致,要将行尾标准化吗?"的解决ie6下面asp.net mvc3 部署应用程序.NET 3.5 安装错误的四个原因及解决方法支持无限制历史记录的Paint.NET 3.5.8 Final,你用了吗?.NET Framework环境安装错误怎么办?Java开发者要了解多少脚本语言,能实现.NET中的效率?

文章评论
发表评论

热门文章 没有查询到任何记录。

最新文章 什么是.NET中的TDD?ASP.NET AJAX入门简介 WebMatrix入门教程VC++2008中如何调用GetOpenFileName打开文件PlaySound函数在VC++6.0中如何播放音乐及声请问VC++回调函数怎么用

人气排行 嵌入式实时操作系统VxWorks入门教程ArrayList 与 string、string[] 的转换C#遍历整个文件夹及子目录的文件代码WebMatrix入门教程asp.net判断文件或文件夹是否存在c#判断数据NULL值的方法vc++6.0怎么写Windows简单窗口代码.net解决数据导出excel时的格式问题