私のアプリケーションにはファイルを追加するリストボックスが含まれており、フォルダーの追加でそれを行うと、このフォルダー内のすべてのファイルをチェックし、各ファイルで異なるスレッドを開いてそれらのファイルをリストボックスに追加します-ロックを使用する必要があります2 つ (またはそれ以上) のファイルが同時にファイルを追加しようとするケースを防ぐには?
private void btnAddDir_Click_1(object sender, EventArgs e)
{
int totalCount = 0;
int count = 0;
string fileToAdd = string.Empty;
List<string> filesList = new List<string>();
BackgroundWorker backgroundWorker = null;
DialogResult dialog = folderBrowserDialog1.ShowDialog();
if (dialog == DialogResult.OK)
{
btnAddfiles.Enabled = false;
btnAddDir.Enabled = false;
btnPlay.Enabled = false;
Editcap editcap = new Editcap();
foreach (string file in SafeFileEnumerator.EnumerateFiles(folderBrowserDialog1.SelectedPath, "*.*", SearchOption.AllDirectories))
{
if (editcap.isWiresharkFormat(file))
{
filesList.Add(file);
totalCount++;
}
}
backgroundWorker = new BackgroundWorker();
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.DoWork +=
(s1, e1) =>
{
foreach (string fileName in filesList)
{
if (editcap.isWiresharkFormat(fileName))
{
if (editcap.isLibpcapFormat(fileName))
{
backgroundWorker.ReportProgress(0, fileName);
count++;
}
else if (!editcap.isLibpcapFormat(fileName))
{
fileToAdd = editcap.getNewFileName(fileName);
if (new FileInfo(fileToAdd).Exists)
{
backgroundWorker.ReportProgress(0, fileToAdd);
count++;
}
}
this.Invoke((MethodInvoker)delegate
{
labelStatus.Text = string.Format("Please wait..({0}/{1} files were added)", count.ToString("#,##0"), totalCount.ToString("#,##0"));
if(listBoxFiles.Items.Count != 0)
listBoxFiles.SetSelected(listBoxFiles.Items.Count - 1, true);
});
}
}
};
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
(s1, e1) =>
{
});
backgroundWorker.ProgressChanged +=
(s1, arguments) =>
{
listBoxFiles.Items.Add(arguments.UserState);
};
backgroundWorker.RunWorkerAsync();
}
}