「session.identify」是我稱之爲無法訪問的第三方COM API。它執行一個服務器查詢,不知何故偶爾會鎖定(並因此暫停正在等待結果的主程序)。AsyncWaitHandle終止正確實施的第三方API?
我的嘗試是將它包裝在一個AsyncDelegate中,這樣我就可以給它一個超時時間,並且在超時過期後允許主程序繼續(類似於this one,只是返回值)。然而,它仍然鎖定,沒有超時的影響。
我是否錯誤地使用了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;
}
我改變它爲您的建議與10秒超時。查詢仍然偶爾會鎖定,但超時條件永遠不會達到。什麼能阻止WaitHandle的工作? – Hauke 2009-07-17 09:50:02