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 で同じことを行う方法がわかりません...