首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么检查SynchronizationContext是否为null?

为什么检查SynchronizationContext是否为null?
EN

Stack Overflow用户
提问于 2015-11-23 09:20:35
回答 3查看 478关注 0票数 4

InstallIfNeeded法 of WindowsFormsSynchronizationContext类,在try块中:

代码语言:javascript
复制
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。

代码语言:javascript
复制
public static SynchronizationContext SynchronizationContext 
{
get 
{
    if (SynchronizationContext.Current == null) 
    {
        SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
    }
    return SynchronizationContext.Current;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-23 09:56:21

这里需要检查空值吗?

我之前的回答忽略了这样一个事实,即SynchronizationContext.Current实际上是在线程基础上创建的,而不是跨多个线程创建的(感谢@PerSerAl指出了这一点)。显然,您可以在代码中看到它:

代码语言:javascript
复制
// Get the current SynchronizationContext on the current thread
public static SynchronizationContext Current 
{
    get      
    {
        return Thread.CurrentThread.GetExecutionContextReader().SynchronizationContext ??
               GetThreadLocalContext();
    }
}

实际上,这样做可以使null检查变得多余,但它本身不受将来可能发生的任何更改的影响,这些更改都是围绕SynchronizationContext实现进行代码编写的。

票数 2
EN

Stack Overflow用户

发布于 2015-11-23 10:12:14

按照现在的确切代码,您是对的。

但是,请看代码的意图。关键是,安装winforms上下文的唯一安全点是没有其他同步上下文。这与具有null同步上下文或默认SynchronizationContext相对应。

在当前代码的确切版本中,同步上下文永远不可能是null这一事实在很大程度上与此无关。诚然,这可能不会改变,因为它是一个公共静态接口,但取决于这是一个完全不必要的依赖。您希望您的代码尽可能清楚地表明它的意图,而此检查正是这样做的,同时也避免了对公共接口的内部行为的直接依赖。

票数 1
EN

Stack Overflow用户

发布于 2015-11-23 10:22:22

下面是我所看到的(前两段和你的问题相同):

代码语言:javascript
复制
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)) {

然后转到:

代码语言:javascript
复制
public static SynchronizationContext SynchronizationContext {
        get {
            if (SynchronizationContext.Current == null) {
                SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
            }

            return SynchronizationContext.Current;
        }

然后导致:in the line (SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());

代码语言:javascript
复制
public static void SetSynchronizationContext(SynchronizationContext syncContext)
    {
        ExecutionContext ec = Thread.CurrentThread.GetMutableExecutionContext();
        ec.SynchronizationContext = syncContext;
        ec.SynchronizationContextNoFlow = syncContext;
    }

但是它返回了SynchronizationContext.Current

代码语言:javascript
复制
public static SynchronizationContext Current 
    {
        get      
        {
            return Thread.CurrentThread.GetExecutionContextReader().SynchronizationContext ?? GetThreadLocalContext();
        }
    }

哪个可能会在这里结束。

代码语言:javascript
复制
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,但是给定??运算符,这是可能的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33867387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档