Dispatcher.CurrentDispatcher.InvokeAsync not working

本文关键字:working not InvokeAsync CurrentDispatcher Dispatcher | 更新日期: 2023-09-27 18:04:03

我正在将WPF应用程序的某些部分移植到一个无窗口库中,以便在其他项目中使用。原始代码中有一些方法是使用Application.Current.Dispatcher.InvokeAsync()调用的。由于这在普通类库中不可用,所以我为它做了一个包装器,并且在库中我尝试使用Dispatcher.CurrentDispatcher.InvokeAsync来代替-我设置了一个中断并看到正在进行的调用,但传递的方法从未执行。我错过了什么?

Dispatcher.CurrentDispatcher.InvokeAsync not working

您可能需要两个版本的分派器包装器:一个用于在内部使用Application.Current.Dispatcher的UI应用程序。另一种是用于直接调用委托而不需要内部调度程序的非ui应用程序。下面的代码是这个想法的一个简单示例:

public class DispatcherWrapper
{
    private readonly Action<Action> _dispatch;
    public DispatcherWrapper(Action<Action> dispatch)
    {
        _dispatch = dispatch;
    }
    public void Dispatch(Action action)
    {
        _dispatch(action);
    }
}
public class Application
{
    internal void SomeCode()
    {
        // A UI application would call...
        var dispatcher = Dispatcher.CurrentDispatcher;
        var dispatcherWrapper = new DispatcherWrapper(action => dispatcher.BeginInvoke(action));
        // A non-UI application would call...
        dispatcherWrapper = new DispatcherWrapper(action => action());
        // The library code would call..
        dispatcherWrapper.Dispatch(() => { 
            // This code runs on the UI thread in UI apps and on any thread in non-UI apps.
        });
    }
}