我想調用的UI調度員對話:Dispatcher.Invoke塊永遠
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遠程)
任何想法處理事件?
UPDATE
這是問題的一個更爲完整的描述:
我有使用.NET遠程Windows服務通信的客戶端應用程序。在某些時候,客戶端調用服務來執行操作(這種調用是由用戶操作觸發的,在這種情況下點擊按鈕)。該服務可能需要憑證才能執行該操作:在這種情況下,會引發一個由客戶端處理的CredentialsNeeded
事件。客戶端然後顯示一個對話框來提示用戶輸入憑據,並在事件參數中設置適當的屬性。當事件處理程序返回時,服務使用憑證完成操作,並將控制權返回給客戶端。
因此,當我收到事件時,UI線程正在等待操作在服務端完成......我認爲這就是爲什麼Invoke
調用沒有處理的原因,但我該如何解決它?我可以創建另一個 UI線程來顯示對話框嗎?在WinForms中,我知道我可以啓動另一個消息泵Application.Run
,但我不知道如何在WPF中執行同樣的操作...
'BeginInvoke'或'InvokeAsync'會解決你的問題。多個STA線程可能很臭。順便說一句,你現在可能已經用'thread.Join();' – MickyD 2018-03-08 23:39:14
@MickyD阻塞了你的_worker_線程,正如我在我的問題中提到的那樣,BeginInvoke不是一個選項,因爲我需要同步獲取對話結果。無論如何,這是一個looong前,這種解決方案爲我工作;) – 2018-03-10 09:51:53