【发布时间】:2010-06-23 17:39:32
【问题描述】:
我正在尝试在 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 远程处理)
有什么想法吗?
更新
这里有一个更完整的问题描述:
我有一个使用 .NET Remoting 与 Windows 服务通信的客户端应用程序。在某些时候,客户端调用服务以执行操作(此调用由用户操作触发,在这种情况下单击按钮)。服务可能需要凭据来执行操作:在这种情况下,它会引发 CredentialsNeeded 事件,由客户端处理。然后客户端显示一个对话框以提示用户输入凭据,并在事件的参数中设置适当的属性。当事件处理程序返回时,服务使用凭据完成操作,并将控制权返回给客户端。
所以,当我收到事件时,UI 线程正在等待服务端的操作完成...我认为这是未处理 Invoke 调用的原因,但我该如何解决它?我可以创建 另一个 UI 线程来显示对话框吗?在 WinForms 中,我知道我可以使用 Application.Run 启动另一个消息泵,但我不知道如何在 WPF 中执行相同操作...
【问题讨论】:
标签: wpf invoke dispatcher