Спасибо большое за розяснения.
У меня было времени в обрез потому, я все переделал на BackgroundWorker...
Вот пример:

private: System::ComponentModel::BackgroundWorker^ backgroundWorker;
FileBase^ fileBase;
...
private: System::Void buttonStart_Click(System::Object^ sender, System::EventArgs^ e) {
buttonStart->Enabled = false;
buttonCancel->Enabled = true;
resultView->Rows->Clear();
array<String^>^ tmp = gcnew array<String^>(directoryList->Items->Count);
directoryList->Items->CopyTo(tmp,0);
fileBase = gcnew FileBase(tmp, checkboxSearchSubdir->Checked);
progressBar->Value = 0;
backgroundWorker->RunWorkerAsync();
}
private: System::Void buttonCancel_Click(System::Object^ sender, System::EventArgs^ e) {
backgroundWorker->CancelAsync();
buttonCancel->Enabled = false;
buttonStart->Enabled = true;
progressBar->Value = 0;
}
private: System::Void backgroundWorker_DoWork(System::Object^ sender, System::ComponentModel::DoWorkEventArgs^ e) {
int counter = 0;
int percentsComplited = 0;
for each(KeyValuePair<String^,Int64> iCandidate in fileBase->candidates)
{
if (backgroundWorker->CancellationPending)
{
return;
}
counter++;
percentsComplited = (counter * 100)/fileBase->candidates->Count;
if (fileBase->IsDuplicate(iCandidate))
backgroundWorker->ReportProgress(percentsComplited,iCandidate.Key + "*" + iCandidate.Value.ToString());
else
backgroundWorker->ReportProgress(percentsComplited,"");
}
}
private: System::Void backgroundWorker_ProgressChanged(System::Object^ sender, System::ComponentModel::ProgressChangedEventArgs^ e) {
if(e->UserState != "")
{
array<String^>^ cellValue = e->UserState->ToString()->Split('*');
resultView->Rows->Add(cellValue[0], cellValue[1]);
}
progressBar->Value = e->ProgressPercentage;
}
private: System::Void backgroundWorker_RunWorkerCompleted(System::Object^ sender, System::ComponentModel::RunWorkerCompletedEventArgs^ e) {
buttonCancel->Enabled = false;
buttonStart->Enabled = true;
}