使用Application.Current.Dispatcher进行单元测试

时间:2016-07-22 11:01:41

标签: c# wpf

我在单元测试时读过很多关于Application.Current.Dispacher为空的帖子。这是我遇到的确切问题。我找到This这正是我正在寻找的。但是,似乎当我去实现这个我无法编译。错误:

  

此处无法访问私人构造函数'Dispatcher'。

在上面的帖子中,他们声明有很多方法可以实现我在下面的代码。因为他没有检查多线程安全检查。我如何进行这些检查并将其编译?

    public static Dispatcher RootDispatcher
    {
        get
        {
            if (_rootDispatcher == null)
            {

                if (Application.Current != null)
                {
                    _rootDispatcher = Application.Current.Dispatcher;
                }
                else
                {
                    var thread = Thread.CurrentThread;
                    _rootDispatcher = new Dispatcher(thread);
                }
            }
            return _rootDispatcher;
        }
        internal set { _rootDispatcher = value; }
    }

1 个答案:

答案 0 :(得分:2)

编译错误是由于您尝试使用的构造函数实际上是私有的(并且您使用不需要的参数调用它)

查看Dispatcher.Current的文档,它说:

  

获取for   线程当前正在执行并创建一个新的(如果还没有)   与线程相关联。

所以,你可以使用:

  • _rootDispatcher = Dispatcher.CurrentDispatcher;

导致Dispatcher实例。

作为优化,您可以始终将Dispatcher.CurrentDispatcher用作“RootDispatcher”。无论Application.Current是否存在。

如果您在生产和测试中都使用此代码,则需要区分这些方案。在生产中使用Application的Dispatcher,并在单元测试中使用'any'Dispatcher(Dispatcher.Current),因为Application不在那里。