我正在尝试在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
的调用会一直阻塞,并且UI线程上从未调用Show
...使用BeginInvoke
不是一个选项:我需要立即获得结果,因为我正在处理来自远程对象的事件(使用.NET remoting)。有什么想法吗?更新:我有一个客户端应用程序,使用.NET Remoting与Windows服务通信。在某个时刻,客户端调用服务执行操作(在这种情况下,由用户操作触发,即单击按钮)。服务可能需要凭据才能执行操作:在这种情况下,它会引发一个
CredentialsNeeded
事件,由客户端处理。然后,客户端显示一个对话框以提示用户输入凭据,并设置事件参数中的适当属性。当事件处理程序返回时,服务使用凭据完成操作,并将控件返回给客户端。因此,当我接收到事件时,UI线程正在等待服务端完成操作...我认为这就是
Invoke
调用未被处理的原因,但是我该如何解决?我可以创建另一个UI线程来显示对话框吗?在WinForms中,我知道我可以使用Application.Run
启动另一个消息泵,但我不知道如何在WPF中做同样的事情...