Я бы не использовал BackgroundWorker, если это то, что вам нужно сделать.Поскольку ваш класс не предоставляет никакого способа предоставления обновлений прогресса, единственное, что он вам дает, это маршалинг метода RunWorkerCompleted
.
Создание класса Thread , сохраните ссылку на негои прервать, если вам нужно.Просто убедитесь, что, когда ваша фоновая работа закончена, вы вызываете Invoke, если обновляете какие-либо элементы управления с результатами.
РЕДАКТИРОВАТЬ:
Вот примитивный пример того, как она может работать.(примечание: это может не скомпилироваться, я не записал это в IDE).
Thread _dbThread;
void DoLongRunningQueryAsync()
{
bool dbWorkFinished = false;
_dbThread = new Thread(() =>
{
// heavy database process
SomeClass.BulkInsert(ExportLine);
dbWorkFinished = true;
});
Thread monitorThread = new Thread(() =>
{
Thread.Sleep(5000);
if (!dbWorkFinished)
{
//Db work took too long. Abort
_dbThread.Abort();
this.Invoke(() => MessageBox.Show("Db work took too long. Query aborted"); );
}
});
_dbThread.Start();
monitorThread.Start();
}
private void ButtonCancelClick(object sender, EventArgs e)
{
_dbThread.Abort()
}