gpt4 book ai didi

c# - 为什么 Dispatcher.Invoke 不执行此示例中的委托(delegate)参数?

转载 作者:太空宇宙 更新时间:2023-11-03 20:39:08 24 4
gpt4 key购买 nike

    [Test]
public void A()
{
var d = Dispatcher.CurrentDispatcher;

Action action = () => Console.WriteLine("Dispatcher invoked me!");

var worker = new BackgroundWorker();
worker.DoWork += SomeWork;

//worker.RunWorkerAsync( (Action) delegate { Console.WriteLine("This works!"); } );
worker.RunWorkerAsync((Action) delegate { d.Invoke(action); } );

System.Threading.Thread.Sleep(2500);
}

private void SomeWork(object sender, DoWorkEventArgs e)
{
(e.Argument as Action)();
}

此代码块不会引发异常。同时,Dispatcher.Invoke 什么也不做。我觉得很奇怪。

我将辅助方法提取到基础 ViewModel 中。工作线程使用此方法 DoOnUIThread() 来避免线程亲和性问题。但是,在我的单元测试中,我发现由于上述问题,尝试测试 View 模型对象会导致失败。

我可以将这整个行为移出到一个可插入的依赖项中,我可以在我的测试中替换它。例如ViewModelBase 依赖于 UIThreadExecutor.Execute(Action) 并且我使用了一个假的,它只是在我的测试中调用操作。但是我很好奇为什么 Dispatcher 的行为方式是这样的..

最佳答案

Dispatcher 只能在主线程空闲并重新进入调度循环时执行其 Begin/Invoke() 职责。那时主线程是静止的,它可以安全地执行分派(dispatch)的请求。以及 Windows 发送给它的任何通知。

在你的情况下它不是空闲的,它卡在 Sleep(2500) 中。

关于c# - 为什么 Dispatcher.Invoke 不执行此示例中的委托(delegate)参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3824939/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com