РЕДАКТИРОВАТЬ : Я только что понял, что KeithS приблизился к хорошему ответу.Основная идея заключается в том, что вы вызываете конструктор XPathDocument , который принимает Stream
, который упаковывает FileStream
.Объект, который вы передаете ему, должен реализовывать функцию Read(byte[], int, int)
для вызова функции FileStream
обернутой Read
или выбросить исключение, если время операции истекло.Вот пример кода:
class XmlStream : FileStream
{
DateTime deadline;
public XmlStream(string filename, TimeSpan timeout)
: base(filename, FileMode.Open)
{
deadline = DateTime.UtcNow + timeout;
}
public override int Read(byte[] array, int offset, int count)
{
if (DateTime.UtcNow > deadline)
throw new TimeoutException();
return base.Read(array, offset, count);
}
}
Вот код, который читает document
, но время ожидания истекает через 1 секунду:
bool found = true;
using(var stream = new XmlStream(document, TimeSpan.FromSeconds(1)))
try
{
xpath = new XPathDocument(stream);
}
catch (TimeoutException)
{
found = false;
}
Если вы создаете отдельный поток вместо выполненияBeginInvoke
, вы можете просто прервать поток, когда отметится таймер (или кто-то нажмет «Отмена»).Хотя прерывание потоков обычно нежелательно, поскольку оно может удерживать блокировку или иметь глобальные данные в несогласованном состоянии, в этом случае все должно быть в порядке, поскольку ваш поток не будет удерживать блокировку или получать доступ к глобальным данным.
Вот код для этого метода, который делает то же самое, что и в предыдущем примере:
bool found = false;
thread = new Thread(() =>
{
xpath = new XPathDocument(document);
found = true;
});
thread.Start();
thread.Join(TimeSpan.FromSeconds(1));
thread.Abort();
Если вам неудобно прерывать потоки в вашем собственном домене приложения, вы можете создать документ в другом домене приложения и вызвать AppDomain.Unload
на это, если это займет слишком много времени.Это потребует некоторой сортировки, но, вероятно, не будет слишком много накладных расходов.
Лучший способ убить процесс - это запустить его в отдельном процессе и использовать некоторый интерфейс удаленного взаимодействия для доступа к нему.,Возможно, это даже сложнее, чем другие опции, так как вам нужно беспокоиться о поиске исполняемого файла, передаче параметров, о том, что какой-то пользователь его завершает, и т. Д.