Я работаю над устаревшим приложением, которое построено поверх NET 3.5. Это ограничение, которое я не могу изменить. Мне нужно выполнить второй поток, чтобы выполнить долговременную задачу без блокировки пользовательского интерфейса. Когда поток завершен, мне нужно выполнить обратный вызов.
Сейчас я попробовал этот псевдокод:
Thread _thread = new Thread(myLongRunningTask) { IsBackground = True };
_tread.Start();
// wait until it done
_thread.Join();
// execute finalizer
Второй вариант, который не блокирует пользовательский интерфейс, выглядит следующим образом:
Thread _thread = new Thread(myLongRunningTask) { IsBackground = True };
_tread.Start();
// wait until it done
while(_thread.IsAlive)
{
Application.DoEvents();
Thread.Sleep(100);
}
// execute finalizer
Конечно, второе решение не является хорошим поводом для перезарядки пользовательского интерфейса. Каков правильный способ выполнения обратного вызова при завершении _thread? Также, как узнать, был ли поток отменен или прерван?
* Примечание: * Я не могу использовать BackgroundWorker, и я не могу использовать библиотеку Async, мне нужно работать с классом родного потока.