ファイルを複数の場所に並行してコピーする簡単なプログラムがあります。プログレスバーとしてポップアップするフォームがあります。
public partial class PleaseWait : Form
{
private static PleaseWait mInstance;
public static void Create()
{
var t = new System.Threading.Thread(() =>
{
mInstance = new PleaseWait();
mInstance.FormClosed += (s, e) => mInstance = null;
Application.Run(mInstance);
});
t.SetApartmentState(System.Threading.ApartmentState.STA);
t.IsBackground = true;
t.Start();
}
public static void Destroy()
{
if (mInstance != null) mInstance.Invoke(new Action(() => mInstance.Close()));
}
public PleaseWait()
{
InitializeComponent();
}
public int t = 0;
private void timer1_Tick(object sender, EventArgs e)
{
if (t == 100)
{
t = 0;
}
else
{
t = t + 10;
progressBar1.Value = t;
}
}
}
コピースレッドごとにを呼び出し、Create
それぞれが10回のうち9回完了すると破棄しますが、すべてを閉じますが、開いたままになることがあるので、このコードを使用してみました
private void closewait()
{
foreach (Form f in Application.OpenForms)
{
if (f is file_copy.PleaseWait)
{
f.Dispose();
}
}
}
しかし、クロススレッドエラーが発生します。コピーが完了したら、PleaseWait
フォームがまだ開いていないことを確認するにはどうすればよいですか。