【发布时间】:2018-01-23 16:34:20
【问题描述】:
关于
Application.Current.Dispatcher.Invoke(action);
我查看了CheckAccess() 以及确定我是否在主 UI 线程上的各种方法。虽然在查看了Dispatcher Source code 的Invoke 之后,它似乎调用了CheckAccess() 并执行了其他检查
调用源代码
public void Invoke(Action callback, DispatcherPriority priority, CancellationToken cancellationToken, TimeSpan timeout)
{
...
...
// Fast-Path: if on the same thread, and invoking at Send priority,
// and the cancellation token is not already canceled, then just
// call the callback directly.
if (!cancellationToken.IsCancellationRequested && priority == DispatcherPriority.Send && CheckAccess())
{
SynchronizationContext oldSynchronizationContext = SynchronizationContext.Current;
try
{
DispatcherSynchronizationContext newSynchronizationContext;
if (BaseCompatibilityPreferences.GetReuseDispatcherSynchronizationContextInstance())
{
newSynchronizationContext = _defaultDispatcherSynchronizationContext;
}
else
{
if (BaseCompatibilityPreferences.GetFlowDispatcherSynchronizationContextPriority())
{
newSynchronizationContext = new DispatcherSynchronizationContext(this, priority);
}
else
{
newSynchronizationContext = new DispatcherSynchronizationContext(this, DispatcherPriority.Normal);
}
}
SynchronizationContext.SetSynchronizationContext(newSynchronizationContext);
callback();
...
所以检查是否需要调用我的对话框最可靠的方法是调用Invoke?当我无法访问Control 时,查看CheckAccess 和SynchronisationContexts 解决方案似乎是多余的。
是这种情况还是我遗漏了一些边缘情况,或者我看不到隐藏的性能损失?
【问题讨论】:
标签: wpf dispatcher ui-thread