私のコードに問題があります。私はメインフォームを持つグラフィックアプリを作成しています。私がボタンをクリックすると、いくつかのファイルをエクスポートしながら進行状況バーを表示する新しいフォームを作成します。私の問題は、プログレスバーを使ってフォームを閉じようとするときに始まります。その理由は、どのエクスポートファイルが終了しないのかということです。閉じるフォームのときにスレッド内で実行中のメソッドを停止する
新しいフォームでは、エクスポートの進行状況を確認してプログレスバーを埋めるメソッドを実行します。このメソッドは1秒ごとに実行されます。エクスポートするには新しいスレッドを作成し、このスレッドはエクスポートメソッドを実行します。
エクスポートが完了したら、フォームとスレッドは正しく終了しますが、フォームを閉じることによって操作を強制停止すると、エクスポートされているスレッドはエクスポートが終了するまで、またはメインフォームを閉じるまで停止しません。
どうすればそのスレッドを停止できますか?
これは私のコードです:
public Form3(File file, string output, string inputFile)
{
InitializeComponent();
this.file = file;
this.output = output;
this.inputFile = inputFile;
progressLabel.Location = new Point(textProgress.Right, progressLabel.Top);
thread = new Thread((ThreadStart)delegate { Exporter.ExportToFile(this.file, this.output, this.inputFile); });
thread.IsBackground = true;
thread.Start();
TimerControl();
}
private void TimerControl()
{
System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();
t.Tick += new EventHandler(GetProgress);
t.Interval = 1000; // in miliseconds
t.Start();
}
private void GetProgress(object sender, EventArgs myEventArgs)
{
int x = Exporter.GetProgress();
progressBar.Maximum = 100;
if (!Exporter.stop)
{
progressBar.Value = x;
progressLabel.Text = x.ToString() + "%";
}
else
{
this.Close();
}
}
これを正しく行うには、Exporter.ExportToFile()にキャンセルのサポートを追加する必要があります –
残念ですが(幾分)効果的です:あなたの 'Closing'イベント'thread.Abort()'を呼び出す - もちろん、他の方法も好きです。 –
それはひどいアドバイスです。 ['決してThread.Abort()を呼び出さない]](http://stackoverflow.com/questions/1559255/whats-wrong-with-using-thread-abort)。 –