Существует два подхода:
1.Инкапсулированное время ожидания
Поток, считывающий данные из сетевого или последовательного порта, может измерять время, прошедшее с момента его запуска, и ожидать данные не более, чем оставшееся время.Сетевые API-интерфейсы обычно предоставляют средства для указания таймаута для операции.Следовательно, выполняя простую DateTime
арифметику, вы можете инкапсулировать управление временем ожидания в своем рабочем потоке.
2.Внешнее время ожидания
Используйте другой поток (или сделайте это в основном потоке, если это возможно), чтобы дождаться завершения рабочего потока в течение определенного периода времени, и если нет, отмените его.Вот так:
// start the worker thread
...
// give it no more than 5 seconds to execute
if (!workerThread.Join(new TimeSpan(0, 0, 5)))
{
workerThread.Abort();
}
Рекомендация: Я бы придерживался первого решения, так как оно ведет к более чистому и удобному в эксплуатации дизайну.Однако в определенных ситуациях может возникнуть необходимость обеспечить средства для «жесткого» прерывания таких рабочих потоков.