HTML5技术

C#与C++的发展历程第三 - C#5.0异步编程巅峰 - hystar(4)

字号+ 作者:H5之家 来源:博客园 2016-01-15 10:03 我要评论( )

上面的类中还出现了一个很重要的类型AsyncMethodBuilderCore,简单的了解一下这个类型也很有必要。 namespaceSystem.Runtime.CompilerServices{internalstructAsyncMethodBuilderCore{internalsealedclassMoveNextR

上面的类中还出现了一个很重要的类型AsyncMethodBuilderCore,简单的了解一下这个类型也很有必要。

namespace System.Runtime.CompilerServices {     internal struct AsyncMethodBuilderCore     {         internal sealed class MoveNextRunner         {             private readonly ExecutionContext m_context;             internal IAsyncStateMachine m_stateMachine;             [SecurityCritical]             private static ContextCallback s_invokeMoveNext;             [SecurityCritical]             internal MoveNextRunner(ExecutionContext context, IAsyncStateMachine stateMachine)             {                 this.m_context = context;                 this.m_stateMachine = stateMachine;             }             [SecuritySafeCritical]             internal void Run()             {                 //这个方法被包装为“继续执行”委托实际执行的代码                 //这个方法最终要的作用是给继续执行的代码设置正确的ExecutionContext             }             [SecurityCritical]             private static void InvokeMoveNext(object stateMachine)             {                 ((IAsyncStateMachine)stateMachine).MoveNext();             }         }         private class ContinuationWrapper         {             internal readonly Action m_continuation;             private readonly Action m_invokeAction;             internal readonly Task m_innerTask;             internal ContinuationWrapper(Action continuation, Action invokeAction, Task innerTask)             {                 if (innerTask == null)                 {                     innerTask = AsyncMethodBuilderCore.TryGetContinuationTask(continuation);                 }                 this.m_continuation = continuation;                 this.m_innerTask = innerTask;                 this.m_invokeAction = invokeAction;             }             internal void Invoke()             {                 this.m_invokeAction();             }         }         internal IAsyncStateMachine m_stateMachine;         internal Action m_defaultContextAction;         public void SetStateMachine(IAsyncStateMachine stateMachine)         {                      }         //上文提到的获取“继续执行”委托的方法         //方法通过包装内部类MoveNextRunner的Run方法来实现         [SecuritySafeCritical]         internal Action GetCompletionAction(Task taskForTracing, ref AsyncMethodBuilderCore.MoveNextRunner runnerToInitialize)         {             Debugger.NotifyOfCrossThreadDependency();             ExecutionContext executionContext = ExecutionContext.FastCapture();             Action action;             AsyncMethodBuilderCore.MoveNextRunner moveNextRunner;             if (executionContext != null && executionContext.IsPreAllocatedDefault)             {                 action = this.m_defaultContextAction;                 if (action != null)                 {                     return action;                 }                 moveNextRunner = new AsyncMethodBuilderCore.MoveNextRunner(executionContext, this.m_stateMachine);                 action = new Action(moveNextRunner.Run);                 if (taskForTracing != null)                 {                     action = (this.m_defaultContextAction = this.OutputAsyncCausalityEvents(taskForTracing, action));                 }                 else                 {                     this.m_defaultContextAction = action;                 }             }             else             {                 moveNextRunner = new AsyncMethodBuilderCore.MoveNextRunner(executionContext, this.m_stateMachine);                 action = new Action(moveNextRunner.Run);                 if (taskForTracing != null)                 {                     action = this.OutputAsyncCausalityEvents(taskForTracing, action);                 }             }             if (this.m_stateMachine == null)             {                 runnerToInitialize = moveNextRunner;             }             return action;         }         private Action OutputAsyncCausalityEvents(Task innerTask, Action continuation)         {                      }         internal void PostBoxInitialization(IAsyncStateMachine stateMachine, AsyncMethodBuilderCore.MoveNextRunner runner, Task builtTask)         {             //初始化AsyncMethodBuilderCore中的状态机变量。这里发生装箱操作。         }         internal static void ThrowAsync(Exception exception, SynchronizationContext targetContext)         {             //将异常与SynchronizationContext相关联         }         internal static Action CreateContinuationWrapper(Action continuation, Action invokeAction, Task innerTask = null)         {             return new Action(new AsyncMethodBuilderCore.ContinuationWrapper(continuation, invokeAction, innerTask).Invoke);         }         internal static Action TryGetStateMachineForDebugger(Action action)         {             //获取用于调试目的的“继续执行”委托         }         internal static Task TryGetContinuationTask(Action action)         {             //获取“继续执行”的Task         }     } }

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 2年前端学习历程,与找不到工作的悲愤与吐槽!(100%真实经历,看博主怎么一步步走向失业) - 蒋启钲

    2年前端学习历程,与找不到工作的悲愤与吐槽!(100%真实经历,看博

    2017-03-29 11:00

  • 开源第三方登录组件OAuthLogin2.0 支持QQ,阿里巴巴,淘宝,京东,蘑菇街,有赞等平台 - 大壮他哥

    开源第三方登录组件OAuthLogin2.0 支持QQ,阿里巴巴,淘宝,京东,蘑菇街

    2017-01-20 15:00

  • 从零到百亿互联网金融架构发展史 - 纯洁的微笑

    从零到百亿互联网金融架构发展史 - 纯洁的微笑

    2017-01-14 13:00

  • 记一次企业级爬虫系统升级改造(四):爬取微信公众号文章(通过搜狗与新榜等第三方平台) - 彩色铅笔

    记一次企业级爬虫系统升级改造(四):爬取微信公众号文章(通过搜狗

    2017-01-12 10:01

网友点评
.