これは私を困惑させました。ソフトウェアのエンタープライズ インストールを支援するために作成した単純なユーティリティがあります。1 つのコンポーネントは、ユーザーが現在自分のマシンに持っている AppData ファイルをバックアップし、デスクトップ上のフォルダーに保存します。
private void backupButton_Click(object sender, EventArgs e)
{
backgroundBackup.RunWorkerAsync();
}
private void backgroundBackup_DoWork(object sender, DoWorkEventArgs e)
{
...
}
private static void CopyAll(DirectoryInfo source, DirectoryInfo target)
{
...
}
// I removed the message boxes from DoWork, and added a RunWorkerCompleted event,
// but neither the confirmation nor the error messgae box from RunWorkerCompleted are shown.
private void backgroundBackup_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
...
}
これは機能しますが、期待した結果が得られません。各ユーザーがバックアップするファイルの合計サイズが 1 ~ 2 GB に近づく可能性があるため、この操作をバックグラウンド スレッドに置きました。これを実行するたびに、ターゲットからすべてのファイルとフォルダーではなく一部がコピー先にコピーされ、コピーされるフォルダーは毎回異なります。少数のファイルとフォルダーのみがコピーされる場合もあれば、ほとんどすべてがコピーされる場合もありますが、ターゲット全体がコピーされることはありません。この操作を単純なコンソール アプリに配置すると、毎回機能します。DoWork メソッドですべての作業を行わない原因となっている BackgroundWorker クラスについて理解する必要があることはありますか?
編集:
BackgroundWorker クラスの問題を複雑にしすぎているのではないかと思います。同僚と話をしたところ、潜在的に長いプロセスを処理するために新しいスレッドを作成する簡単な方法が提案されました。
private void backupButton_Click(object sender, EventArgs e)
{
Thread backupThread = new Thread(backupThreadJob);
backupThread.Start();
}
private void backupThreadJob()
{
try
{
//copy files and stuff
}
catch(Exception ex)
{
MessageBox.Show("Error: " + ex.Message);
}
}
これで仕事は完了です。私は BackgroundWorker を使用しようとして失敗し、一部のファイルのみがコピーされている理由を理解できませんでした。みんなの助けに感謝します!