0

ある時点でStartFormを開くメインフォームがあります。

private void TestChosen(object sender, TestChosenEventArgs e)
{
    var frm = new TestStartForm(e.Test, StartTest);
    frm.ShowDialog();
}

このStartFormには、実際にテストを開始するためのボタンがあります。

public TestStartForm(Test test, StartTestHandler startTestHandler)
{
    InitializeComponent();
    _test = test;
    OnStartTest = startTestHandler;
}

public delegate void StartTestHandler(object sender, StartTestEventArgs e);
public event StartTestHandler OnStartTest;

public void InvokeOnStartTest(StartTestEventArgs e)
{
    StartTestHandler handler = OnStartTest;
    if (handler != null) handler(this, e);
}

private void btnStart_Click(object sender, EventArgs e)
{
    InvokeOnStartTest(new StartTestEventArgs(_test));
    Close();
}

私が直面している問題は、StartTestHandlerの作業が完全に完了するまでStartFormが開いたままになることです。StartTestHandlerで、実際のテストで別のフォームが開かれます。

テストが終了するのを待たずにStartFormを強制的に閉じる方法はありますか?

編集

@cowboydanが提案したように、フォームを表示するためにBeginInvokeを使用しましたが、正しく機能する前に、実際のTestFormだけでなくStartFormに対しても実行する必要がありました。

private void TestChosen(object sender, TestChosenEventArgs e)
{
    BeginInvoke((Action)delegate
    {
        var frm = new TestStartForm(e.Test, StartTest);
        frm.ShowDialog();
    });

}

private void StartTest(object sender, StartTestEventArgs e)
{
    BeginInvoke((Action)delegate
    {
        var frm = new TestForm(e.Test);
        frm.ShowDialog();
    });
}
4

1 に答える 1

1

ThreadPoolとは別のスレッドでStartFormを起動するBeginInvokeを使用できます。これはかなり一般的な方法です。

于 2012-12-16T11:53:32.943 に答える