• 四川郎酒股份有限公司获第十二届人民企业社会责任奖年度环保奖 2019-05-13
  • 银保监会新规剑指大企业多头融资和过度融资 2019-05-12
  • 韩国再提4国联合申办世界杯 中国网友无视:我们自己来 2019-05-11
  • 中国人为什么一定要买房? 2019-05-11
  • 十九大精神进校园:风正扬帆当有为 勇做时代弄潮儿 2019-05-10
  • 粽叶飘香幸福邻里——廊坊市举办“我们的节日·端午”主题活动 2019-05-09
  • 太原设禁鸣路段 设备在测试中 2019-05-09
  • 拜耳医药保健有限公司获第十二届人民企业社会责任奖年度企业奖 2019-05-08
  • “港独”没出路!“梁天琦们”该醒醒了 2019-05-07
  • 陈卫平:中国文化内涵包含三方面 文化复兴表现在其中 2019-05-06
  • 人民日报客户端辟谣:“合成军装照”产品请放心使用 2019-05-05
  • 【十九大·理论新视野】为什么要“建设现代化经济体系”?   2019-05-04
  • 聚焦2017年乌鲁木齐市老城区改造提升工程 2019-05-04
  • 【专家谈】上合组织——构建区域命运共同体的有力实践者 2019-05-03
  • 【华商侃车NO.192】 亲!楼市火爆,别忘了买车位啊! 2019-05-03
    • / 20
    • 下载费用:30 金币  

    重庆时时彩分模式利润: 嵌套任务的结果的编组.pdf

    关 键 词:
    嵌套 任务 结果 编组
      专利查询网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    摘要
    申请专利号:

    CN201110063301.5

    申请日:

    2011.03.07

    公开号:

    CN102193822A

    公开日:

    2011.09.21

    当前法律状态:

    授权

    有效性:

    有权

    法律详情: 授权|||专利申请权的转移IPC(主分类):G06F 9/46变更事项:申请人变更前权利人:微软公司变更后权利人:微软技术许可有限责任公司变更事项:地址变更前权利人:美国华盛顿州变更后权利人:美国华盛顿州登记生效日:20150727|||实质审查的生效IPC(主分类):G06F 9/46申请日:20110307|||公开
    IPC分类号: G06F9/46 主分类号: G06F9/46
    申请人: 微软公司
    发明人: S·H·托布; J·E·霍格; J·J·达菲; D·S·谢哈
    地址: 美国华盛顿州
    优先权: 2010.03.08 US 12/719,700
    专利代理机构: 上海专利商标事务所有限公司 31100 代理人: 胡利鸣
    PDF完整版下载: PDF下载
    法律状态
    申请(专利)号:

    CN201110063301.5

    授权公告号:

    |||||||||

    法律状态公告日:

    2015.08.26|||2015.08.19|||2013.04.03|||2011.09.21

    法律状态类型:

    授权|||专利申请权、专利权的转移|||实质审查的生效|||公开

    摘要

    本发明涉及用于嵌套任务的结果的编组的方法、系统和计算机程序产品。解包方法能被用以减少任务嵌套的层级并确保在任务之间编组合适的结果。能使用代理任务以表示包装任务和被包装的任务的聚集异步操作。该代理任务具有完成状态,该完成状态至少指示聚集异步操作的完成状态。聚集异步操作的完成状态是从包装任务和被包装的任务的一个或多个完成状态中确定并设置的。代理任务的完成状态能被传送到调用逻辑以向调用逻辑指示聚集异步操作的完成状态。

    权利要求书

    1.一种在包括一个或多个处理器和系统存储器的计算机系统处的用于将一个任务的状态编组到另一个任务的方法,所述方法包括:从调用逻辑(133)接收对于包装任务(111)的调用的动作,包装任务(111)具有由在包装任务(111)内包装的被包装的任务(112)表示的结果;创建表示包装任务(111)以及被包装的任务(112)的聚集异步操作的代理任务的动作,所述代理任务具有至少指示聚集异步操作的完成状态的完成状态(131);将代理任务(132)返回调用逻辑(133)的动作,代理任务(132)被返回到调用逻辑(133)而不需要调用逻辑(133)等待包装任务(111)或被包装的任务(112)的完成;确定聚集异步操作的完成状态的动作,包括:确定包装任务(111)的完成状态的动作;以及当包装任务的完成状态指示包装任务趋向完成时确定被包装的任务(112)的完成状态的动作;将代理任务的完成状态(131)设置为以下之一的动作:a)当包装任务的完成状态指示该包装任务趋向完成时,被包装的任务(112)的完成状态,或b)当包装任务的完成状态指示该包装任务没有趋向完成时,包装任务(111)的完成状态;以及将代理任务的完成状态(131)传送到调用逻辑(133)以至少向调用逻辑(133)指示聚集异步操作的完成状态的动作。2.如权利要求1所述的方法,其中确定聚集异步操作的完成状态的动作包括基于包装任务和被包装的任务的完成状态均为趋向完成、确定聚集异步操作的完成状态为趋向完成的动作。3.如权利要求2所述的方法,其中设置代理任务的完成状态的动作包括指示聚集异步操作趋向完成的动作。4.如权利要求2所述的方法,其特征在于,进一步包括从被包装的任务产生对于代理任务的结果数据。5.如权利要求4所述的方法,其中将代理任务的完成状态传送到调用逻辑的动作包括将被包装的任务的结果数据与聚集异步操作的完成状态一起传送到调用逻辑的动作。6.如权利要求1所述的方法,其中确定聚集异步操作的完成状态的动作包括基于包装任务和被包装的任务之一被导致包装任务和被包装的任务之一停止操作的外部动作取消、确定聚集异步操作的完成状态为被取消的动作。7.如权利要求6所述的方法,其中设置代理任务的完成状态的动作包括指示聚集异步操作的完成状态为被取消以传送聚集异步操作被外部动作停止的动作。8.如权利要求1所述的方法,其中确定聚集异步操作的完成状态的动作包括基于包装任务和被包装的任务之一中的内部故障从而导致包装任务和被包装的任务之一停止操作、确定聚集异步操作的完成状态为故障的动作。9.如权利要求8所述的方法,其中设置代理任务的完成状态的动作包括指示聚集异步操作故障的动作。10.如权利要求8所述的方法,其特征在于,进一步包括生成与包装任务和被包装的任务之一的内部故障相对应的异常数据的动作。11.如权利要求10所述的方法,其中将代理任务的完成状态返回到调用任务的动作包括将异常数据与聚集异步操作的完成状态一起返回到调用逻辑的动作。12.如权利要求1所述的方法,其中从调用逻辑接收对于包装任务的调用的动作包括接收对于格式Task<Task>的任务的调用的动作;以及其中将代理任务的完成状态返回到调用逻辑的动作包括返回格式Task的代表任务的完成状态的动作。13.如权利要求1所述的方法,其中从调用逻辑接收对于包装任务的调用的动作包括接收对于格式Task<Task<TResult>>的任务的调用的动作;以及其中将代理任务的完成状态返回到调用逻辑的动作包括返回格式Task<Task<TResult>>的代表任务的完成状态的动作。14.一种供在计算机系统处使用的计算机程序产品,所述计算机程序产品用于实现一种将一个任务的状态编组到另一个任务的方法,所述计算机程序产品包括其上存储有计算机可执行指令的一个或多个计算机存储介质,所述指令在处理器处执行时使得所述计算机系统执行所述方法,所述方法包括以下:从调用逻辑(133)接收对于包装任务(111)的调用,包装任务(111)具有由在包装任务(111)内包装的被包装的任务(112)表示的结果;创建表示包装任务(111)以及被包装的任务(112)的聚集异步操作的代理任务,所述代理任务具有至少指示聚集异步操作的完成状态的完成状态(131);将代理任务(132)返回调用逻辑(133),代理任务(132)被返回到调用逻辑(133)而不需要调用逻辑(133)等待包装任务(111)或被包装的任务(112)的完成;确定聚集异步操作的完成状态,包括:确定包装任务(111)的完成状态;以及当包装任务的完成状态指示包装任务趋向完成时确定被包装的任务(112)的完成状态;将代理任务的完成状态(131)设置为以下之一:a)当包装任务的完成状态指示该包装任务趋向完成时,被包装的任务(112)的完成状态,或b)当包装任务的完成状态指示该包装任务没有趋向完成时,包装任务(111)的完成状态;以及将代理任务的完成状态(131)传送到调用逻辑(133)以至少向调用逻辑(133)指示聚集异步操作的完成状态。15.一种计算机系统,所述计算机系统包括:系统存储器;一个或多个处理器;以及一个或多个具有其上存储的表示调用逻辑(133)、包装任务(111)以及解包组件(101)的计算机可读指令的计算机存储介质,其中包装任务(111)进一步包装被包装的任务(112),调用逻辑(133)被配置以:调用包装任务(111);从解包组件(101)接收对于代理任务的句柄(132);接收代理任务的完成状态(131),代理任务的完成状态(131)指示表示包装任务(111)和被包装的任务(112)的聚集异步操作的完成状态;解包组件(101)进一步包括包装任务状态确定组件(102)、被包装的任务状态确定组件(103)、完成状态确定组件(104)、以及空检查器(106),其中解包组件被配置以:接收包装任务(111);创建代理任务;将对于代理任务的句柄(132)返回调用逻辑(133),代理任务被返回到调用逻辑而不需要调用逻辑等待包装任务或被包装的任务的完成;确定聚集异步操作的完成状态,包括:包装任务状态确定组件(102)确定包装任务(111)的完成状态(114,116);空检查器(106)确定被包装的任务(112)不是空;以及当包装任务(111)的完成状态指示包装任务(111)趋向完成并且被包装的任务(112)不是空时,被包装的任务状态确定组件(103)确定被包装的任务(112)的完成状态(122,123,126);完成状态确定组件(104)将代理任务的完成状态(131)设置为以下之一:a)当包装任务的完成状态指示该包装任务趋向完成时,被包装的任务的完成状态,或b)当包装任务的完成状态指示该包装任务没有趋向完成时,包装任务的完成状态;以及完成状态确定组件将代理任务的完成状态(131)传送到调用逻辑(133)以至少向调用逻辑(133)指示聚集异步操作的完成状态。

    说明书

    嵌套任务的结果的编组

    相关申请的交叉引用

    不适用。

    技术领域

    本发明涉及嵌套任务的结果,尤其涉及嵌套任务的结果的编组。

    背景技术

    1.背景和相关技术

    计算机系统和相关技术影响社会的许多方面。的确,计算机系统处理信息的能力已转变了人们生活和工作的方式。计算机系统现在通常执行在计算机系统出现以前手动执行的许多任务(例如,文字处理、日程安排和会计等)。最近,计算机系统彼此耦合并耦合到其他电子设备以形成计算机系统和其他电子设备可以在其上传输电子数据的有线和无线计算机网络。因此,许多计算任务的执行分布在多个不同的计算机系统和/或多个不同的计算环境上。

    在一些计算环境中,任务被更明确地定义为表示应用要执行的操作的工作项。许多任务被配置以返回特定类型(例如,整数、字符串等等)的值来将信息传送回执行任务的应用。例如,Task<TResult>(任务<TResult>)是其操作返回类型TResult的值的任务。任务被嵌套在另一任务中也不是不普遍的。当任务被嵌套时,任务(外部任务)的返回值类型可以是另一任务(内部任务)。例如,Task<Task>(任务<任务>)是其操作返回类型Task的值的任务。嵌套的任务也能被配置以返回进一步的值。例如,Task<Task<TResult>>(任务<任务<TResult>>)是其操作返回类型Task<TResult>(任务<TResult>)的值的任务(Task<TResult>又被配置以返回类型TResult的值)。

    各种不同的计算场景能生成嵌套的任务。不幸的是,嵌套的任务能引起容易被忽视和/或难以纠正的非预期的应用行为(例如,隐错)。

    例如,当调用一(外部)任务时,该(外部)任务能调用进一步的(内部)任务以创建任务的理想结果。然而,如果该进一步的(内部)任务需要花费一些时间来完成,让该进一步的(内部)任务异步完成使得(外部)任务不需要阻塞来等待结果是理想的。

    例如,考虑一外部任务,该外部任务返回一人的朋友列表上的朋友数量的整数计数。该外部任务可以具有形式Task<int>(任务<int>)。在该外部任务内部可以是对于存储朋友列表的网络数据库的异步调用。由于对于网络数据库的调用是异步的,因此外部任务不阻塞并且其线程是释放的。然而,该外部任务必须依然返回值,即使其在网络数据库调用之前完成并因此没有朋友数量的计数。由此,该外部任务返回表示数据库调用的完成的内部任务,其也具有形式Task<int>。由此,该外部任务实质上被表示为Task<Task<int>>(任务<任务<int>>)。因此,访问外部任务的结果返回内部任务(即,Task<int>),其是对于将返回朋友数量的计数的项的引用。

    随着异步任务的数量的增加,非预期的应用行为的可能也增加。例如,API可包括用于异步地登录Web服务(例如,社交网络站点)、检索朋友列表以及向各个朋友发送电子邮件的功能。LogOn(登录)方法采用用户名和密码,并且其返回表示登录操作的Task<TResult>(任务<TResult>)。当登录操作完成时,任务的结果将是UserToken(用户令牌)。例如:

    public?Task<UserToken>LogOn(string?username,string?password);

    GetFriendsList(获得朋友列表)方法采用UserToken(用户令牌),并且其返回表示朋友列表检索操作的Task<TResult>(任务<TResult>)。当朋友列表检索操作完成时,任务的结果将是FriendCollection(朋友集合)。例如:

    public?Task<FriendCollection>GetFriendList(UserToken?userToken);

    SendMail(发送邮件)方法采用Friend(朋友),并且其返回表示电子邮件发送操作的Task(任务)。例如:

    public?Task?SendEmail(Friend?friend,string?subject,string?body);

    用户希望使用这些API和任务延续来写代码,任务延续被用以当原始任务已经完成时调度任务。例如:

    虽然“.ContinueWith”被包括在第2行,但其指示当外部任务完成时代码继续。由此,当LogOn操作已经异步完成时,对于第2行GetFriendList的调用被调用以异步地检索朋友列表。该调用将返回Task<FriendCollection>(任务<朋友集合>)以表示异步操作的结果。由于传递到第2行ContinueWith的代理中的代码返回Task<FriendCollection>,“friends(朋友)”变量是Task<Task<FriendCollection>>(任务<任务<朋友集合>>)。friends(朋友)变量是Task<Task<FriendCollection>>(任务<任务<朋友集合>>)导致在foreach循环处的错误,因为“friends.Result”返回Task<FriendCollection>(任务<朋友集合>)而不是FriendCollection(朋友集合)。其他类似的问题发生在该代码示例的其他行。

    这些和其他类似类型的编译器错误通常通过避免类型推导(即,不使用“var”关键字)来解决。然而,即使当开发者意识到类型不匹配,其他逻辑必须依旧被编码以解包“friends(朋友)”任务使得其返回真实的FriendCollection(朋友集合)。编码这样的逻辑是非平凡的并且如果逻辑考虑异常、取消等是相对困难的。

    发明内容

    本发明涉及用于编组嵌套的任务的结果的方法、系统和计算机程序产品。例如,本发明的实施例便于将一个任务的状态编组到另一个任务。从调用逻辑接收对于包装任务的调用。包装任务具有由在包装任务内部包装的被包装的任务表示的结果。

    创建表示包装任务和被包装的任务的聚集异步操作的代理任务。该代理任务具有完成状态,该完成状态至少指示聚集异步操作的完成状态。该代理任务被返回到调用逻辑而不需要调用逻辑等待包装任务或被包装的任务的完成。

    确定聚集异步操作的完成状态。确定聚集异步操作的完成状态包括确定包装任务的完成状态。当包装任务的完成状态指示包装任务趋向完成时,确定聚集异步操作的完成状态也包括确定被包装的任务的完成状态。

    当包装任务的完成状态指示包装任务趋向完成时,代理任务的完成状态被设置为被包装的任务的完成状态?;蛘?,当包装任务的完成状态指示被包装的任务没有趋向完成时,代理任务的完成状态被设置为包装任务的完成状态。在聚集异步操作的完成后,代理任务的完成状态被传送到调用逻辑以至少向调用逻辑指示聚集异步操作的完成状态。

    提供本发明内容是为了以精简的形式介绍将在以下具体实施方式中进一步描述的一些概念。本发明内容不旨在标识出所要求?;さ闹魈獾墓丶卣骰虮匾卣?,也不旨在用于帮助确定所要求?;さ闹魈獾姆段?。

    本发明的附加特征和优点将在以下描述中叙述,且其一部分根据本说明书将是显而易见的,或可通过对本发明的实践来获知。本发明的特征和优点可通过在所附权利要求书中特别指出的工具和组合来实现和获得。本发明的这些和其他特征将通过以下描述和所附权利要求书变得更加显而易见,或可通过对下文中所述的本发明的实践来领会。

    附图简述

    为了描述可获得本发明的上述和其它优点和特征的方式,将通过参考附图中示出的本发明的具体实施例来呈现以上简要描述的本发明的更具体描述??梢岳斫?,这些附图只描绘了本发明的各典型实施例,并且因此不被认为是对其范围的限制,将通过使用附图并利用附加特征和细节来描述和解释本发明,在附图中:

    图1A示出了便于将一个任务的状态编组到另一任务的示例计算机体系结构。

    图1B示出了来自图1A的解包(unwrap)组件的更详细的视图。

    图2示出了将一个任务的状态编组到另一任务的示例方法的流程图。

    图3A和3B示出了解包一任务的示例。

    具体实施方式

    本发明涉及用于编组嵌套的任务的结果的方法、系统和计算机程序产品。例如,本发明的实施例便于将一个任务的状态编组到另一任务。从调用逻辑接收对于包装任务的调用。包装任务具有由在包装任务内包装的被包装的任务表示的结果。

    创建表示包装任务和被包装的任务的聚集异步操作的代理任务。该代理任务具有完成状态,该完成状态至少指示聚集异步操作的完成状态。一般而言,任务(包括包装任务、被包装的任务、以及代理任务中的任一)的完成状态能是以下之一:具有结果数据的趋向完成、具有异常数据的故障、或被取消。然而,其它完成状态也是可能的。该代理任务被返回到调用逻辑而不需要调用逻辑等待包装任务或被包装的任务的完成。

    确定聚集异步操作的完成状态。确定聚集异步操作的完成状态包括确定包装任务的完成状态。当包装任务的完成状态指示包装任务趋向完成时,确定聚集异步操作的完成状态也包括确定被包装的任务的完成状态。

    当包装任务的完成状态指示包装任务趋向完成时,代理任务的完成状态被设置为被包装的任务的完成状态?;蛘?,当包装任务的完成状态指示包装任务没有趋向完成时,代理任务的完成状态被设置为包装任务的完成状态。在聚集异步操作的完成后,代理任务的完成状态被传送到调用逻辑以至少向调用逻辑指示聚集异步操作的完成状态。

    本发明的各实施例可以包括或利用诸如,一个或多个处理器和系统存储器等包括计算机硬件的专用或通用计算机,这将在以下做出进一步讨论。本发明范围内的各实施例还包括用于承载或存储计算机可执行指令和/或数据结构的物理和其他计算机可读介质。这样的计算机可读介质可以是可由通用或专用计算机系统访问的任何可用介质。存储计算机可执行指令的计算机可读介质是物理存储介质。承载计算机可执行指令的计算机可读介质是传输介质。由此,作为示例而非限制,本发明的各实施例可包括至少两种完全不同的计算机可读介质:计算机存储介质和传输介质。

    计算机存储介质包括RAM、ROM、EEPROM、CD-ROM或其他光盘存储、磁盘存储或其他磁存储设备、或可用于存储计算机可执行指令或数据结构形式的所需程序代码装置且可由通用或专用计算机访问的任何其他介质。

    “网络”被定义为允许在计算机系统和/或??楹?或其他电子设备之间传输电子数据的一个或多个数据链路。当信息通过网络或另一通信连接(硬连线、无线、或硬连线或无线的组合)传输或提供给计算机时,该计算机将该连接适当地视为传输介质。传输介质可包括可用于携带计算机可执行指令或数据结构形式的所需程序代码装置并可由通用或专用计算机访问的网络和/或数据链路。上述的组合也应被包括在计算机可读介质的范围内。

    此外,在到达各种计算机系统组件之后,计算机可执行指令或数据结构形式的程序代码装置可从传输介质自动转移到计算机存储介质(或者相反)。例如,通过网络或数据链路接收到的计算机可执行指令或数据结构可被缓存在网络接口???例如,“NIC”)内的RAM中,然后最终被传送到计算机系统RAM和/或计算机系统处的较不易失性的计算机存储介质。由此,应当理解,计算机存储介质可被包括在同样(或甚至主要)利用传输介质的计算机系统组件中。

    计算机可执行指令例如包括,当在处理器处执行时使通用计算机、专用计算机、或专用处理设备执行某一功能或某组功能的指令和数据。计算机可执行指令可以是例如二进制代码、诸如汇编语言等中间格式指令、或甚至源代码。尽管用结构特征和/或方法动作专用的语言描述了本主题,但可以理解的是,所附权利要求书中定义的主题不必限于上述特征或动作。相反,上述特征和动作是作为实现权利要求的示例形式而公开的。

    本领域的技术人员将理解,本发明可以在具有许多类型的计算机系统配置的网络计算环境中实践,这些计算机系统配置包括个人计算机、台式计算机、膝上型计算机、消息处理器、手持式设备、多处理器系统、基于微处理器的或可编程消费电子设备、网络PC、小型计算机、大型计算机、移动电话、PDA、寻呼机、路由器、交换机等等。本发明也可以在其中通过网络链接(或者通过硬连线数据链路、无线数据链路,或者通过硬连线和无线数据链路的组合)的本地和远程计算机系统两者都执行任务的分布式系统环境中实践。在分布式系统环境中,程序??榭梢晕挥诒镜睾驮冻檀娲⑵鞔娲⑸璞钢?。

    图1A示出了便于将一个任务的状态编组到另一任务的示例计算机体系结构100。参考图1A,计算机体系结构100包括调用逻辑133、包装任务111、以及解包组件101。包装任务111进一步包括被包装的任务112。在计算机体系结构100中描绘的各个组件能够通过计算机系统总线相互连接。因此,组件能通过计算机系统总线相互通信。

    或者,在计算机体系结构100内描绘的组件中的一个或多个可通过诸如例如局域网(“LAN”)、广域网(“WAN”)和甚至因特网等网络(或作为网络的一部分)彼此连接。因此,所描绘的计算机系统中的每一个以及任何其他连接的计算机系统及其组件都可以创建消息相关数据并通过网络交换消息相关数据(例如,网际协议(“IP”)数据报和利用IP数据报的其他更高层协议,诸如传输控制协议(“TCP”)、超文本传输协议(“HTTP”)、简单邮件传输协议(“SMTP”)等)。

    图2示出了将一个任务的状态编组到另一任务的示例方法200的流程图。方法200将参考计算机体系结构100的组件和数据来描述。

    方法200包括从调用逻辑接收对于包装任务的调用的动作,包装任务具有由在包装任务内包装的被包装的任务表示的结果(动作201)。例如,包装任务111能接收来自调用逻辑133的调用。包装任务111的结果由被包装的任务112表示。调用逻辑133可以是执行代码???、软件组件等等的期望来自包装任务111的执行的结果的另一程序。

    方法200包括创建表示包装任务以及被包装的任务的聚集异步操作的代理任务的动作,该代理任务具有至少指示聚集异步操作的完成状态的完成状态(动作202)。例如,在执行包装任务111期间,扩展方法能调用解包组件101。解包组件101能创建表示包装任务111和被包装的任务112的聚集异步操作的代理任务。该代理任务具有完成状态,该完成状态至少指示表示包装任务111和被包装的任务112的聚集异步操作的完成状态。

    方法200包括将代理任务返回调用逻辑的动作,代理任务被返回到调用逻辑而不需要调用逻辑等待包装任务或被包装的任务的完成(动作203)。例如,解包组件101能将代理任务句柄132返回到调用逻辑133。代理任务句柄132能被返回到调用逻辑133而不需要调用逻辑133等待包装任务111或被包装的任务112的完成。

    方法200包括确定聚集异步操作的完成状态的动作(动作204)。例如,解包组件111能确定表示包装任务111和被包装的任务112的聚集异步操作的完成状态。

    图1B示出解包组件101的更详细的视图。如图1B中描绘的,解包组件101包括包装任务状态确定组件102、被包装的任务状态确定组件103、完成状态确定组件104、以及空检查器106。当调用解包组件101时,在包装任务状态确定组件102上采用继续任务。包装任务状态确定组件102确定包装任务的完成状态。任务的完成状态能包括状态和可任选返回数据。例如,任务的完成状态可以是:趋向完成(状态)、趋向完成(状态)和结果数据(返回数据)、故障(状态)和异常数据(返回数据)、或被取消(状态)。其它完成状态也是可能的。

    例如,可以一包装任务是Task<TResult>(任务<TResult>),但具有空的结果值。由此,包装任务的正文不返回其原本应该返回的Task(任务),而是返回空值。当这种情况发生时,存在多种如何处理的选项,诸如使代理出故障或取消代理。

    当包装任务的状态是被取消或具有异常数据的故障时,包装任务状态确定组件102将包装任务的完成状态传递给完成状态确定组件104。在接收包装任务的完成状态后,完成状态确定组件104将代理任务的完成状态设置为包装任务的完成状态。由此,如果包装任务的完成状态是被取消或具有异常数据的故障,完成状态确定组件104对应地将代理任务的完成状态分别设置为被取消或具有异常数据的故障。

    另一方面,当包装任务的状态是趋向具有结果数据的完成时,包装任务状态确定组件102将包装任务的完成状态传递给被包装的任务状态确定组件102。在被包装的任务状态确定组件102上使用包装任务的完成状态来采用继续任务。

    被包装的任务状态确定组件103确定被包装的任务的完成状态。被包装的任务状态确定组件103然后将被包装的任务的完成状态传递给完成状态确定组件104。在接收被包装的任务的完成状态后,完成状态确定组件104对应地将代理任务的完成状态设置为被包装的任务的完成状态。

    完成状态确定组件104然后向调用逻辑输出代理任务的完成状态。

    空检查器106检查被包装的任务以确定被包装的任务是否是空??盏谋话暗娜挝竦募觳獾贾麓砣挝竦谋蝗∠淖刺?。

    由此,当包装任务的完成状态是被取消或故障时,代理任务的完成状态被设置为包装任务的完成状态。另一方面,当包装任务的完成状态是趋向完成时,代理任务的完成状态被设置为被包装的任务的完成状态。

    因此,动作204包括确定包装任务的完成状态的动作(动作205)。例如,解包组件101能接收包括被包装的任务112的包装任务111。继续任务113在包装任务状态确定组件102上被采用。包装任务状态确定组件102确定包装任务111的完成状态。

    当包装任务111的完成状态是被取消时,包装任务状态确定组件102向完成状态确定组件104发送被取消114。类似地,当包装任务111的完成状态是具有异常数据的故障时,包装任务状态确定组件102向完成状态确定组件104发送故障116和异常数据117。另一方面,当包装任务111的完成状态是趋向具有结果数据的完成时,包装任务状态确定组件102向被包装的任务状态确定组件103发送趋向完成118和结果数据119。由此,包装任务状态确定组件102或者向完成状态确定组件104发送被取消或故障之一,或者向被包装的任务状态确定组件103发送趋向完成。

    动作204包括当包装任务的完成状态指示包装任务趋向完成时确定被包装的任务的完成状态的动作(动作206)。例如,继续任务121在被包装的任务状态确定组件103上被采用。包装任务状态确定组件103确定包装任务112的完成状态。

    当被包装的任务112的完成状态是被取消时,被包装的任务状态确定组件103可向完成状态确定组件104发送被取消122。类似地,当被包装的任务112的完成状态是具有异常数据的故障时,被包装的任务状态确定组件103可向完成状态确定组件104发送故障123和异常数据124。同样地,当被包装的任务113的完成状态是趋向具有结果数据的完成时,被包装的任务状态确定组件103可向完成状态确定组件104发送趋向完成126和结果数据127。由此,在适当时,被包装的任务状态确定组件103向完成状态确定组件103发送被取消、故障、或趋向完成之一。

    方法200包括将代理任务的完成状态设置为以下之一的动作:a)当包装任务的完成状态指示该包装任务趋向完成时,被包装的任务的完成状态,或b)当包装任务的完成状态指示该包装任务没有趋向完成时,包装任务的完成状态(动作207)。例如,在从被包装的任务状态确定组件103接收到被取消、故障或趋向完成的完成状态后,完成状态确定组件104可将代理的完成状态设置为包装任务112的完成状态。另一方面,在从包装任务状态确定组件102接收到被取消或故障的完成状态后,完成状态确定组件104可将代理的完成状态设置为包装任务111的完成状态。

    一般地,当包装任务111的完成状态是被取消、故障或趋向具有空结果的完成时,不使用被包装的任务状态确定组件103。

    方法200包括将代理任务的完成状态传送到调用逻辑以至少向调用逻辑指示聚集异步操作的完成状态的动作(动作208)。例如,解包组件101能将完成状态131传送到调用逻辑133。完成状态131指示表示包装任务111和被包装的任务112的聚集异步操作的完成状态。

    本发明的某些实施例使用扩展方法来将Task<Task>(任务<任务>)转换为完全地表示包括异常、取消状态等等的原始嵌套的任务的Task(任务)。例如,图3A描绘了将Task<Task>(任务<任务>)转换为Task(任务)的示例。如描绘的,被包装的任务303是在包装任务302内被包装的。包装任务302和被包装的任务303是对于解包组件301的输入。解包组件301将包装任务302和被包装的任务303转换为代表任务304。代表任务304完全地表示被包装的任务303。

    类似地,本发明的其他实施例使用扩展方法来将Task<Task<TResult>>(任务<任务<TResult>>)转换为完全地表示包括异常、取消状态等等的原始嵌套的任务的Task<TResult>(任务<TResult>)。例如,图3B描绘了将Task<Task<TResult>>(任务<任务<TResult>>)转换为Task<TResult>(任务<TResult>)的示例。如描绘的,被包装的任务313是在包装任务312内被包装的。包装任务312和被包装的任务313是对于解包组件311的输入。解包组件311将包装任务312和被包装的任务313转换为代表任务314。代表任务314完全地表示被包装的任务313。

    本发明的实施例包括结合继续Task(任务)使用TaskCompletionSource<TResult>(任务完成源<TResult>)对象来将一个任务完成状态编组到另一任务。由此,嵌套的任务的完成状态能被流到能作为代理用于进一步计算的新的非嵌套任务。

    能定义方法来实现本发明的实施例。实质上能使用任何编程术语和样式来定义方法,诸如例如,C++模板、Java类等等。使用C#术语和样式,方法能被定义为如下:

    public?static?Task?Unwrap(this?Task<Task>task);

    public?static?Task<TResult>Unwrap<TResult>(this?Task<Task<TResult>>task);

    在某些实施例中,使用扩展方法而不是普通实例方法。使用扩展方法帮助确保通过合适类型(例如,分别为Task<Task>(任务<任务>)和Task<Task<TResult>>(任务<任务<TResult>>))的对象来调用Unwrap(解包)。

    以下伪代码能被用以解包Task<Task<TResult>>(任务<任务<TResult>>)。用于解包Task<Task>(任务<任务>)的代码以类似的方式运作。

    在伪代码示例中,创建TaskCompletionSource<TResult>(任务完成源<TResult>),并且其成员Task(任务)最终从方法返回。使用继续Task(任务)来设置返回的Task(任务)。首先,为包装Task(任务)调度继续。如果包装Task(任务)是被取消或故障,状态被编组到返回的Task(任务),并且过程结束。如果是RanToCompletion(趋向完成),检测被包装的Task(任务)。如果被包装的Task(任务)是空,那么返回的Task(任务)是被取消。否则,为被包装的Task(任务)调度继续以将其最终状态(被取消、故障+异常数据、或趋向完成+结果)编组到返回的Task(任务)。

    使用解包扩展方法能减少非预期的程序行为。以下伪代码实例使用解包以帮助确保在任务之间编组正确的结果。

    在该伪代码示例中,解包扩展方法在行2和12被使用。例如,行2的解包方法确保GetFriendList(获得朋友列表)返回Task<FriendCollection>(任务<朋友集合>)而不是Task<Task<FriendCollection>(任务<任务<朋友集合>)。因此,在行6的foreach循环处,“friends.Result”(朋友.结果)合适地返回FriendCollection(朋友集合)(而不是Task<FriendCollection>(任务<朋友集合>))。

    因此,解包方法被用以减少任务嵌套的层级并确保在任务之间编组合适的结果,例如,从Task<Task<TResult>>(任务<任务<TResult>>)到Task<TResult>(任务<TResult>)或Task<Task>(任务<任务>)到Task(任务)。解包方法也能被多次应用以减少多层嵌套任务的层级。例如,对于Task<Task<Task<Task>>>t(任务<任务<任务<任务>>>t),能使用t.Unwrap().Unwrap().Unwrap()(t.解包().解包().解包())来移除嵌套的多个层级,将结果减少到一个Task(任务)。

    能使用代理任务以表示包装任务和被包装的任务的聚集异步操作。该代理任务具有完成状态,该完成状态至少指示聚集异步操作的完成状态。聚集异步操作的完成状态是从包装任务和被包装的任务的一个或多个完成状态中确定并设置的。代理任务的完成状态能被传送到调用逻辑以向调用逻辑指示聚集异步操作的完成状态。

    本发明可具体化为其它具体形式而不背离其精神或本质特征。所描述的实施例在所有方面都应被认为仅是说明性而非限制性的。从而,本发明的范围由所附权利要求书而非前述描述指示。落入权利要求书的等效方案的含义和范围内的所有改变应被权利要求书的范围所涵盖。

    关于本文
    本文标题:嵌套任务的结果的编组.pdf
    链接地址://www.4mum.com.cn/p-5875085.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    [email protected] 2017-2018 www.4mum.com.cn网站版权所有
    经营许可证编号:粤ICP备17046363号-1 
     


    收起
    展开
  • 四川郎酒股份有限公司获第十二届人民企业社会责任奖年度环保奖 2019-05-13
  • 银保监会新规剑指大企业多头融资和过度融资 2019-05-12
  • 韩国再提4国联合申办世界杯 中国网友无视:我们自己来 2019-05-11
  • 中国人为什么一定要买房? 2019-05-11
  • 十九大精神进校园:风正扬帆当有为 勇做时代弄潮儿 2019-05-10
  • 粽叶飘香幸福邻里——廊坊市举办“我们的节日·端午”主题活动 2019-05-09
  • 太原设禁鸣路段 设备在测试中 2019-05-09
  • 拜耳医药保健有限公司获第十二届人民企业社会责任奖年度企业奖 2019-05-08
  • “港独”没出路!“梁天琦们”该醒醒了 2019-05-07
  • 陈卫平:中国文化内涵包含三方面 文化复兴表现在其中 2019-05-06
  • 人民日报客户端辟谣:“合成军装照”产品请放心使用 2019-05-05
  • 【十九大·理论新视野】为什么要“建设现代化经济体系”?   2019-05-04
  • 聚焦2017年乌鲁木齐市老城区改造提升工程 2019-05-04
  • 【专家谈】上合组织——构建区域命运共同体的有力实践者 2019-05-03
  • 【华商侃车NO.192】 亲!楼市火爆,别忘了买车位啊! 2019-05-03
  • 后二组选复式8码技巧 大乐透计算器 双色球开奖数据库 老北京pk拾 北京pk人工计划全天免费版 重庆时时现场直播视频 北京pk10冷热走势图 必赢客手机版 分分快三时时计划app 七乐彩单式怎么算中奖 11选5稳赚任选3计划 pk10双面盘必赢方法 北京pk计划软件安卓版 幸运飞艇计划预测软件 重庆时时系统乱了吗 全网最早更新资料36码