「session.identify」は、私が呼び出してアクセスできないサードパーティの COM API です。サーバークエリを実行すると、何らかの理由で時々ロックアップします (その結果、結果を待っているメインプログラムが停止します)。
私の試みはそれを AsyncDelegate でラップすることでしたので、タイムアウトを与えることができ、タイムアウトの期限が切れた後、メインプログラムを続行できます(これと同様に、戻り値のみで)。ただし、タイムアウトが影響を与えずにロックアップします。
AsyncHandle.WaitOne を間違って使用していますか? API が中止されないようにする何かが 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;
}