我正在尝试在 UI 调度程序上调用一个对话框:
class DialogService : IDialogService
{
private readonly Dispatcher _dispatcher = Application.Current.Dispatcher;
public bool? Show(IDialogViewModel viewModel)
{
if (_dispatcher.CheckAccess())
{
var dialogWindow = new DialogWindow();
return dialogWindow.Show(viewModel);
}
else
{
Func<IDialogViewModel, bool?> func = Show;
return (bool?)_dispatcher.Invoke(func, viewModel);
}
}
}
但是,调用Invoke
永远阻塞,并且Show
永远不会在 UI 线程上调用......
使用BeginInvoke
不是一个选项:我需要立即得到结果,因为我正在处理来自远程对象的事件(使用 .NET 远程处理)
任何的想法 ?
更新
以下是对该问题的更完整描述:
我有一个使用 .NET Remoting 与 Windows 服务通信的客户端应用程序。在某些时候,客户端调用服务以执行操作(此调用由用户操作触发,在这种情况下单击按钮)。服务可能需要凭据来执行操作:在这种情况下,它会引发一个CredentialsNeeded
由客户端处理的事件。然后客户端显示一个对话框以提示用户输入凭据,并在事件的参数中设置适当的属性。当事件处理程序返回时,服务使用凭据完成操作,并将控制权返回给客户端。
因此,当我收到事件时,UI 线程正在等待服务端的操作完成......我认为这Invoke
是未处理调用的原因,但我该如何解决呢?我可以创建另一个UI 线程来显示对话框吗?在 WinForms 中,我知道我可以使用 启动另一个消息泵Application.Run
,但我不知道如何在 WPF 中做同样的事情......