“session.identify”是我调用且无法访问的第三方COM 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;
}
答案 0 :(得分:1)
根据我从http://msdn.microsoft.com/en-us/library/kzy257t0.aspx可以理解的内容,您应该对WaitOne()方法的返回值进行逻辑检查并将逻辑包装在
之内无论是否发生超时,您都在运行EndInvoke,因此您从session.Identify获得了相同的时间错误。
result.AsyncWaitHandle.WaitOne(timeout, false); // checks if theres is a timeout and returns true/false
identifyDelegate.EndInvoke(out iresult, result); //code to run if WaitOne returns true
你可能想要这样做:
if(result.AsyncWaitHandle.WaitOne(timeout))
{
identifyDelegate.EndInvoke(out iresult, result);
}
else
{
//timeout occurred
//handle timeout
}
<强>更新强>
您可能还想查看this SO thread。问题似乎与你的问题几乎完全相同。此外,已接受的答案提供了一种可重用的方法来实现错误管理