A
BackgroundWorker[
^] would probably be a better fit for this type of problem.
private readonly BackgroundWorker _missingElementsWorker;
private int _totalMissingElements;
public Form1()
{
InitializeComponent();
_missingElementsWorker = new BackgroundWorker
{
WorkerReportsProgress = true,
WorkerSupportsCancellation = true,
};
_missingElementsWorker.ProgressChanged += MissingElementsProgressChanged;
_missingElementsWorker.DoWork += CountMissingElements;
_missingElementsWorker.RunWorkerCompleted += MissingElementsCounted;
}
public int TotalMissingElements
{
get { return _totalMissingElements; }
set
{
_totalMissingElements = value;
txtTME.Text = totalMissingElements.ToString();
}
}
private void CountTotalMissingElements(DataTable files)
{
TotalMissingElements = 0;
_missingElementsWorker.RunWorkerAsync(files);
}
private void CountMissingElements(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = (BackgroundWorker)sender;
DataTable files = (DataTable)e.Argument;
int result = 0;
foreach (DataRow r in files.Rows)
{
if (worker.CancellationPending)
{
e.Cancel = true;
return;
}
string filePath = r["FilePath"].ToString();
result += GetNumberOfMissingElements(filePath);
worker.ReportProgress(result);
}
e.Result = result;
}
private void MissingElementsProgressChanged(object sender, ProgressChangedEventArgs e)
{
TotalMissingElements = e.ProgressPercentage;
}
private void MissingElementsCounted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
}
else if (e.Error != null)
{
}
else
{
int totalMissingElements = (int)e.Result;
Debug.Assert(totalMissingElements == TotalMissingElements);
}
}