[英]C# Modal dialog box (ShowDialog or MessageBox.Show) in async method not works as expected
我有一個最頂層的 WinForm,它帶有一個簡單的按鈕,可以異步執行一些命令:
private async void button1_Click(object sender, EventArgs e)
{
await System.Threading.Tasks.Task.Run(() =>
{
System.Threading.Thread.Sleep(2000);
//Problem1: not works as "modal" dialog box (Main form remains active!)
new Form().ShowDialog();
//Problem2: not shown as "modal" messagebox (Main form remains active!)
MessageBox.Show("Test");
});
}
在異步 function 內部是 Messagebox.Show ()和ShowDialog()方法,但是:
問題 1(已解決):新表單未作為模式對話框打開(主表單仍處於活動狀態且可訪問!)
問題 2(已解決): MessageBox.Show()方法不表現為模式對話框(主窗體仍處於活動狀態且可訪問。)。
我需要async-await以防止主 UI 凍結,但我還希望內部的消息框(和子表單)顯示為模式對話框。 如何通過異步方法顯示模式對話框(在最頂層的主窗體上)?
謝謝
問題一的解決方案: ShowDialogAsync擴展方法解決了問題。
問題2的解決方案:
private async void button1_Click(object sender, EventArgs e)
{
var handle = this.Handle;
await System.Threading.Tasks.Task.Run(() =>
{
System.Threading.Thread.Sleep(2000);
//Solution for Problem2:
NativeWindow win32Parent = new NativeWindow();
win32Parent.AssignHandle(handle);
//Works as expected (Topmost and Modal):
MessageBox.Show(win32Parent, "Test");
});
}
Task.Run()
在后台線程中運行工作。 通常,您不應該從后台線程中顯示 windows,但您可以。 要解決您的問題,您需要使用 UI 線程 Dispatcher。
Application.Current.Dispatcher.Invoke(() => MessageBox.Show("Test"));
或者
Application.Current.Dispatcher.Invoke(() => new Form().ShowDialog());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.