У меня есть тема:
void threadCode(object o)
{
doStuffHere(o); // Blocking call. Sometimes hangs.
}
и я так называю:
Thread t = new Thread(new ThreadStart(delegate()
{
threadCode(o);
}));
t.Start();
StopWatch sw = new StopWatch();
sw.Start();
while (t.IsAlive)
{
Application.DoEvents();
if (sw.EllapsedMilliseconds > myTimeout)
// Somehow kill t even though doStuffHere(o) is blocked (but hung)
}
Я использую .NET Zip Library и звоню ZipFile.CommitUpdate()
, которая работает большую часть времени, но иногда просто зависает. Я не знаю почему, я не вижу ничего в документации, которая указывает, почему это происходит. Небольшой файл, который должен занимать не более 5 - 10 секунд, иногда будет находиться там более 5 минут без прогресса. Графики ввода / вывода в проводнике процессов показывают, что процесс не читает или не записывает данные и не использует процессор. По сути, если это произойдет, я хочу убить CommitUpdate()
и повторить попытку один или два раза, прежде чем сдаться.
Есть идеи, как убить поток, застрявший в блокирующем вызове?
(В качестве альтернативы - те из вас, кто имеет опыт работы с этой библиотекой zip: знаете ли вы, почему она иногда зависает с некоторыми файлами? Я изменяю содержимое файлов .docx и .pptx (GZip). Это будет идеальное решение.)