[.net] timeout для произвольной операции

Jekich

Существует ли возможность в .net установить timeout на выполнение произвольной операции?
Хочется чего-то а ля

try
{
magic(timeout)
{
SomeOperation;
}
}
catch ( TimeOutException )
{
throw;
}

val63

Ну например так

Task task = new Task => Func;
task.Start;

task.Wait(TimeSpan.FromSeconds(5;

if (!task.IsCompleted)
{
throw new TimeoutException;
}

Только
а) task.Wait может бросить AggregateException
б) при истечении таймаута поток с таском не убивается и не прекращает выполняться, чтобы это делалось надо думать что-то с CancellationToken'ами
в) точно хочешь связываться с многопоточностью и асинхронщиной?:)

Jekich

в) точно хочешь связываться с многопоточностью и асинхронщиной?:)
Думала об этом - совсем не хочу :) Проще бы что-нить.
Я не эксперт в .net, предположила, что есть готовые решения на тему сабжа. Столкнулась с проблемой, программа зависает на инициализации класса из сторонней dll. От этой dll'ки отказаться не могу, в реализацию init'а timeout не встроен, вот и думаю, как малой кровью решить эту проблему.

val63

Если эта дллина не работает, то зачем тебе она? :-)

bleyman

Ну, никак иначе это не сделать тогда, кроме как создавать отдельный тред для инициализации и прибивать его если не получилось. Могут быть дикие проблемы если сторонняя дллка например использует thread local storage или сама создаёт треды, или создаёт гуи (или другие) somewhat thread-bound объекты, ну или хотя бы запоминает хэндл треда в котором была создана.
Я не знаю, если у тебя правда такая мерзостная дллка которую кровь из носа нужно заюзать, почитай про AppDomain, а то и вовсе создавай настоящий отдельный процесс который будет её врапить...

rosali

Запусти код, который использует эту глючную dll в отдельном _процессе_. И вызывай его через какой-нибудь rpc. В любом rpc должны быть таймауты.

zorin29

Использовать TPL для запуска какого-то неконтролируемого процесса, который нужно прибить по таймауту, ИМХО нецелесообразно, т.к. в TPL нет механизма принудительной остановки.

var initThread = new Thread( => Func; );
initThread.Start;
if (!initThread.Join(TimeSpan.FromSeconds(5
initThread.Abort;

Ну и плюсуюсь к в случае нетривиальной DLL-ки.

val63

Зато TPL использует тредпул и не делает непредсказуемого аборта.
Но так как чо виснет и почему и при каких условиях неясно, трудно подобрать лучший вариант. С процессами тоже придется открыть для себя прелести межпроцессной коммуникации

zorin29

так нам как раз и нужен непредсказуемый аборт :)

val63

Нам - это кому?:-)
Оставить комментарий
Имя или ник:
Комментарий: