Я собрал один, который (я думаю) делает работу. Пожалуйста, дайте мне знать, если я уйду.
Вот простой пример того, как это работает.
var backgroundWorker = new BackgroundWorker(){WorkerSupportsCancellation = true};
backgroundWorker.DoWork += (sender, args) =>
{
var thisWorker = sender as BackgroundWorker;
var _child = new Thread(() =>
{
//..Do Some Code
});
_child .Start();
while (_child.IsAlive)
{
if (thisWorker.CancellationPending)
{
_child.Abort();
args.Cancel = true;
}
Thread.SpinWait(1);
}
};
backgroundWorker.RunWorkerAsync(parameter);
//..Do Something...
backgroundWorker.CancelAsync();
Поскольку фоновый работник является частью пула потоков, мы не хотим его прерывать. Но мы можем запустить поток изнутри, который может позволить прервать процесс. Затем backgroundWorker в основном выполняется до тех пор, пока либо дочерний поток не будет завершен, либо мы не дадим ему сигнал убить процесс. Фоновый рабочий поток может затем вернуться в пул чтения. Обычно я заключаю это во вспомогательный класс и пропускаю через метод делегата, который я хочу, чтобы фоновый поток запускал в качестве параметра, и запускал в дочернем потоке.
Пожалуйста, кто-нибудь, дайте мне знать, если я бьюсь головой о стену, но это, кажется, работает нормально .. Но это проблема с потоками, не так ли ... переменные результаты, которые вы можете получить, когда запускаете его в разное время.