2

タイトルが示すように、プログラムが何かが終了するのを待ってから、閉じるボタンをクリックして終了する方法。

プログラムを終了できるように、いくつかの重要なタスクが完了していることを確認する必要があります。しかし、私はそれを行う方法がわかりません。

次のようなフラグを作成しようとしました。

public partial class MainForm : Form
    {
        public bool closeable = true;
        public MainForm()
        {
            InitializeComponent();
        }
         public setCloseable()
         {
             this.closeable = false;
         }
    }

他のスレッドでは、私のプログラムが非常に重要なことをしているときに、タスクが終了した後に "closeable" を false に設定し、closeable を true に設定します。閉じるボタンをクリックすると、次のコードを使用します。

private void MainForm_closing(object sender, FormClosingEventArgs e)
    {
        if (this.closeable == true)
        {
            Application.Exit();
        }
    }

これは機能しませんでした。これは、使用時に値が true でない場合、[閉じる] をクリックするとプログラムが閉じないためです。

この道でいいの?どのように改善すればよいですか、または何か提案はありますか?

4

4 に答える 4

0

コードはそのままにしておきますが、クロージング ハンドラで to を代入FormClosingEventArgs.CancelTrueて、プログラムがクロージングしないようにする必要があります。

追加する必要があるのはTimer、タスクを実行していて、まだ開始されていない場合にのみ開始する終了ハンドラーです。このタイマーは、1 秒ごと、5 秒ごと、または適切な量と見なされる任意の量で実行されます。タイマーの仕事は、タスクが終了したかどうかを確認することです。終了した場合は、closeableフィールドを true に設定Closeし、プログラムでイベントを発生させます。

次に、FormClosingイベントが発生し、それが true に設定されず、プログラムが終了できることを確認closeableしますTrueFormClosingEventArgs.Cancel

Timer timer1 = null;
public MainForm()
{
    InitializeComponent();

    timer1 = new Timer();
    timer1.Interval = (int)new TimeSpan(0, 0, 4).TotalMilliseconds;
    timer1.Tick += (s, ev) => { timer1.Stop();  closeable = IsTaskDone(); Close(); };
}

public bool closeable = true;
public void setCloseable()
{
    this.closeable = false;
}

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (this.closeable == true)
    {
        Application.Exit();
    }
    else
    {
        timer1.Start();

        e.Cancel = true;
    }
}

private bool IsTaskDone()
{
    // TODO: returns true if the task is completed
}
于 2013-07-28T14:04:27.020 に答える