21

Form.ShowDialog() メソッドにより、新しく呼び出されたフォームが閉じられるまでコードが停止します。ShowDialog() メソッドが呼び出された後もコードを実行し続ける必要があります。バックグラウンドワーカーの使用についてグーグルで読みましたか?でも、初めて聞いたし、使ったこともありません。

Form2 form2this = new Form2();
form2this.ShowDialog();
MessageBox.Show("Something");

このコードはボタンをクリックした後に実行されます。ShowDialog を呼び出して、ユーザーがメイン フォームを操作できないようにしながら、メイン フォームが作業を続行できるようにするにはどうすればよいですか?

議論されていたら申し訳ありませんが、私が見つけたものはすべて、そのような単純なタスクを実行するのが非常に難しいようです. SHowDialog メソッドに含まれていないことに驚いています。たとえば、ShowDialog().Continue はクールです。

4

6 に答える 6

20
  • ポップアップが閉じられるまでブロックするのではなく、コードを続行したい場合は、Show代わりにShowDialog.

  • 子フォームが起動している間に親フォームに実行させたいアクションがある場合は、BackgroundWorker を使用する (または新しいスレッド/タスクを手動で開始する) ことが適切な場合があります。ただし、そのタスクが何であるかについて詳しく知ることは役に立ちます。メイン フォームまたは子フォームと対話する必要がある場合、それは私にとっては面倒なことのように思えます。UI インタラクションなしで何らかのバックグラウンド タスクを実行する必要がある場合、これは正しい考え方です。

  • もう 1 つの可能性は、本当にやりたいことは、親フォームではなく、子フォームで実行する必要があるということです。

于 2012-11-05T19:57:08.963 に答える
7

モーダル ダイアログが開いている間に非同期操作を行う限り、button1_Click() がボタンのイベント ハンドラーであると仮定すると、以下に示すように簡単に実行できます。

private async void button1_Click(object sender, EventArgs e)
{
    // create and display modal form
    Form2 modalForm = new Form2();
    BeginInvoke((Action)(() => modalForm.ShowDialog()));

    // do your async background operation
    await DoSomethingAsync();

    // close the modal form
    modalForm.Close();
}


private async Task DoSomethingAsync()
{
    // example of some async operation....could be anything
    await Task.Delay(10000);
}

Show() の使用を提案したソリューションを使用すると、モーダルにしたいダイアログが、アプリ間を行ったり来たりした後、メイン フォームの後ろに表示される場合があることがわかりました。上記のソリューションを使用すると、それは決して起こりません。

于 2016-01-20T18:10:54.337 に答える
0

モーダル ダイアログを閉じずにコードの実行を続行するには WindowsFormsSynchronizationContext.Current.Post(-=> {"Your code"}, null); に使える。ここで詳細を確認できます -

http://newapputil.blogspot.in/2015/05/continue-executing-code-after-calling.html

于 2015-05-08T10:21:02.760 に答える
-1

async の次の解決策だと思いますShowDialog

public bool DialogResultAsync
{
    get;
    private set;
}

public async Task<bool> ShowDialogAsync()
{
    var cts = new CancellationTokenSource();
    // Attach token cancellation on form closing.
    Closed += (object sender, EventArgs e) =>
    {
        cts.Cancel();
    };
    Show(); // Show message without GUI freezing.
    try
    {
        // await for user button click.
        await Task.Delay(Timeout.Infinite, cts.Token);
    }
    catch (TaskCanceledException)
    { } 
}

public void ButtonOkClick()
{
    DialogResultAsync = true;
    Close();
}

public void ButtonCancelClick()
{
    DialogResultAsync = false;
    Close();
}

メイン フォームでは、次のコードを使用する必要があります。

public async void ShowDialogAsyncSample()
{
    var msg = new Message();
    if (await msg.ShowDialogAsync())
    {
        // Now you can use DialogResultAsync as you need.
        System.Diagnostics.Debug.Write(msg.DialogResultAsync);
    }
}
于 2014-08-27T06:35:42.040 に答える