InstallIfNeeded法 of WindowsFormsSynchronizationContext类,在try块中:
SynchronizationContext currentContext = AsyncOperationManager.SynchronizationContext;
//Make sure we either have no [....] context
//or that we have one of type SynchronizationContext
if (currentContext == null || currentContext.GetType() == typeof(SynchronizationContext))
{
...因此,首先调用AsyncOperationManager.SynchronizationContext getter,并检查其返回值是否为null。这里需要检查空值吗?
下面是AsyncOperationManager.SynchronizationContext的代码。它首先检查当前同步上下文是否为空,如果为空,则创建一个新上下文。因此,这个getter可能永远不会返回null。
public static SynchronizationContext SynchronizationContext
{
get
{
if (SynchronizationContext.Current == null)
{
SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
}
return SynchronizationContext.Current;
}发布于 2015-11-23 09:56:21
这里需要检查空值吗?
我之前的回答忽略了这样一个事实,即SynchronizationContext.Current实际上是在线程基础上创建的,而不是跨多个线程创建的(感谢@PerSerAl指出了这一点)。显然,您可以在代码中看到它:
// Get the current SynchronizationContext on the current thread
public static SynchronizationContext Current
{
get
{
return Thread.CurrentThread.GetExecutionContextReader().SynchronizationContext ??
GetThreadLocalContext();
}
}实际上,这样做可以使null检查变得多余,但它本身不受将来可能发生的任何更改的影响,这些更改都是围绕SynchronizationContext实现进行代码编写的。
发布于 2015-11-23 10:12:14
按照现在的确切代码,您是对的。
但是,请看代码的意图。关键是,安装winforms上下文的唯一安全点是没有其他同步上下文。这与具有null同步上下文或默认SynchronizationContext相对应。
在当前代码的确切版本中,同步上下文永远不可能是null这一事实在很大程度上与此无关。诚然,这可能不会改变,因为它是一个公共静态接口,但取决于这是一个完全不必要的依赖。您希望您的代码尽可能清楚地表明它的意图,而此检查正是这样做的,同时也避免了对公共接口的内部行为的直接依赖。
发布于 2015-11-23 10:22:22
下面是我所看到的(前两段和你的问题相同):
SynchronizationContext currentContext = AsyncOperationManager.SynchronizationContext;
//Make sure we either have no [....] context or that we have one of type SynchronizationContext
if (currentContext == null || currentContext.GetType() == typeof(SynchronizationContext)) {然后转到:
public static SynchronizationContext SynchronizationContext {
get {
if (SynchronizationContext.Current == null) {
SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
}
return SynchronizationContext.Current;
}然后导致:in the line (SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
public static void SetSynchronizationContext(SynchronizationContext syncContext)
{
ExecutionContext ec = Thread.CurrentThread.GetMutableExecutionContext();
ec.SynchronizationContext = syncContext;
ec.SynchronizationContextNoFlow = syncContext;
}但是它返回了SynchronizationContext.Current
public static SynchronizationContext Current
{
get
{
return Thread.CurrentThread.GetExecutionContextReader().SynchronizationContext ?? GetThreadLocalContext();
}
}哪个可能会在这里结束。
private static SynchronizationContext GetThreadLocalContext()
{
SynchronizationContext context = null;
#if FEATURE_APPX
if (context == null && Environment.IsWinRTSupported)
context = GetWinRTContext();
#endif
return context;
}如您所见,如果context返回false,则IsWinRTSupported可以为null。
根据我所看到的,空检查可能是个好主意。我不知道第一个条件Thread.CurrentThread.GetExecutionContextReader().SynchronizationContext是否可以返回null,但是给定??运算符,这是可能的。
https://stackoverflow.com/questions/33867387
复制相似问题