簡體   English   中英

C# 異步方法中的模態對話框(ShowDialog 或 MessageBox.Show)無法按預期工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM