我在单元测试时读过很多关于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; }
}
答案 0 :(得分:2)
编译错误是由于您尝试使用的构造函数实际上是私有的(并且您使用不需要的参数调用它)
查看Dispatcher.Current的文档,它说:
获取for 线程当前正在执行并创建一个新的(如果还没有) 与线程相关联。
所以,你可以使用:
_rootDispatcher = Dispatcher.CurrentDispatcher;
导致Dispatcher实例。
作为优化,您可以始终将Dispatcher.CurrentDispatcher
用作“RootDispatcher
”。无论Application.Current
是否存在。
如果您在生产和测试中都使用此代码,则需要区分这些方案。在生产中使用Application的Dispatcher,并在单元测试中使用'any'Dispatcher(Dispatcher.Current),因为Application不在那里。