http://blogs.msdn.com/b/pfxteam/archive/2012/06/15/executioncontext-vs-synchronizationcontext.aspx?Redirected=true
果然如其所说,System.Threading.ExecutionContext有两个Run方法。
调用await关键字实际上就是用ThreadpoolTaskScheduler, 内部的方法实际都是用ignoreSyncContext那个参数的Run
// System.Threading._ThreadPoolWaitCallback
[SecurityCritical]
internal static void PerformWaitCallbackInternal(_ThreadPoolWaitCallback tpWaitCallBack)
{
if (tpWaitCallBack._executionContext == null)
{
WaitCallback waitCallback = tpWaitCallBack._waitCallback;
waitCallback(tpWaitCallBack._state);
return;
}
ExecutionContext.Run(tpWaitCallBack._executionContext, _ThreadPoolWaitCallback._ccb, tpWaitCallBack, true);
}
[SecurityCritical]
internal static void PerformWaitCallbackInternal(_ThreadPoolWaitCallback tpWaitCallBack)
{
if (tpWaitCallBack._executionContext == null)
{
WaitCallback waitCallback = tpWaitCallBack._waitCallback;
waitCallback(tpWaitCallBack._state);
return;
}
ExecutionContext.Run(tpWaitCallBack._executionContext, _ThreadPoolWaitCallback._ccb, tpWaitCallBack, true);
}
除了这个,另一个用了ExecutionContext却没有传递SynchronizationContext的例子见这里。即DispatcherOperation的Invoke也存在对SyncCtx的特殊对待。