私の問題は、しばらく解決策を探していましたが、成功しませんでした。別のスレッドで作成されたフォームを閉じる
私のプログラムには数秒かかるタスクがあり、そのタスクが完了している間に新しいフォームを表示したいのですが。新しいフォームにはローディングバーとテキストがあります。
新しいフォームをタスクと並行して表示する必要があります。そうしないと、新しいフォームを閉じるまでタスクが開始されません。
これは私が今持っているソリューションです。
private void loadingBar()
{
frmLoading frm = new frmLoading("Please wait while the database is being backed up", "This might take several days.");
frm.ShowDialog();
}
public void Backup()
{
Thread load = new Thread(new ThreadStart(loadingBar));
load.Start();
///Execute a task.
load.Abort();
}
だから、これはOKに動作しますが、私の質問です:作るために、負荷のスレッドでフォーム「FRM」を閉鎖するほうがよいのではないだろうそれは止まる?
プログレスバーのように扱います。表示するフォームに従属するバックグラウンドスレッドとして「プロセス」を実行します。その後、そのフォームを「メイン」スレッドから呼び出します。メインスレッドは読み込みフォームを表示してロックし、読み込みフォームはバックグラウンドスレッドとして何かを実行します。こうすることで、読み込みフォーム自体がプロセスを追跡し、一旦終了するとそのプロセスを終了することができます。 – Nevyn
@Daveなぜ 'backgroundWorker'を使わないのですか? また、スレッドのコードを 'Using()'ステートメントに入れることを検討すると、完了時にスレッド自体が破棄されます。 – Hexie
これは基本的には間違ったことです。ワーカースレッドにUIを表示するには、いくつかの非常に厄介な失敗モードがあります。これを逆にする必要があり、UIスレッドに「読み込み中」ウィンドウを表示し、ワーカースレッド上でバックアップを実行します。 –