I have a topmost WinForm with a simple button that executes some commands asynchronously:
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");
});
}
Inside the async function are the Messagebox.Show() and ShowDialog() methods, BUT:
Problem 1(solved): The new form does not open as modal dialog box (the main form is still active and accessible!)
Problem 2(solved): The MessageBox.Show() method doesn't behave as modal dialog box (the main form is still active and accessible!).
I need async-await to prevent the main UI from freezing, but I also want messageboxes (and sub-forms) inside to be displayed as modal dialog box. How can i show modal dialog boxes (on the main topmost Form) via async method?
Thanks
Solution for problem-1: ShowDialogAsync extension method solves the problem.
Solution for problem-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");
});
}