"session.identify" - это сторонний COM API, к которому я обращаюсь и не имею доступа. Он выполняет запрос к серверу, который иногда как-то блокируется (и, таким образом, останавливает основную программу, ожидающую результата).
Моя попытка заключалась в том, чтобы обернуть его в AsyncDelegate, чтобы я мог дать ему тайм-аут, а после истечения тайм-аута позволить основной программе продолжить (аналогично этой , только с возвратом значение). Тем не менее, он по-прежнему блокируется без эффекта времени ожидания.
Я неправильно использую AsyncHandle.WaitOne? Может ли быть что-то в API, что предотвращает его прерывание?
private delegate void AsyncIdentifyCaller(CoAudioIdSignature signature, uint numResults, uint serverFlags , out IIdentifyResult result);
private IIdentifyResult identifyAndWait(CoAudioIdSession session, CoAudioIdSignature signature, uint numResults, out IIdentifyResult iresult)
{
AsyncIdentifyCaller identifyDelegate = new AsyncIdentifyCaller(session.Identify);
IAsyncResult result = identifyDelegate.BeginInvoke(
signature,
numResults,
0,
out iresult,
null,
null);
// wait up to timeout [ms] and then continue without a proper result
int timeout = 30000;
result.AsyncWaitHandle.WaitOne(timeout, false);
identifyDelegate.EndInvoke(out iresult, result);
return iresult;
}