我需要拨打第三方图书馆,但我不能总是等待结果。我决定在后台线程上进行呼叫,然后等待有限的时间来完成呼叫(最好等待,但我不能永远等待)。我的方法如下。我传入一个调用第三方方法的代理
public static bool ExecuteWithTimeout(int timeout, Action a)
{
AutoResetEvent taskComplete = new AutoResetEvent(false);
Logger.instance.LogTrace("thread pool request start");
ThreadPool.QueueUserWorkItem((x) =>
{
Logger.instance.LogTrace("thread pool request invoking delegate");
a();
Logger.instance.LogTrace("thread pool request invoking set");
taskComplete.Set();
Logger.instance.LogTrace("thread pool request set complete");
});
return taskComplete.WaitOne(timeout);
}
问题是调用线程似乎不会很快从WaitOne()调用中唤醒。如果我传入超时3000,我希望Waitone()调用阻止不超过3秒。但是,在调用.Set()和WaitOne()方法返回之间似乎存在很长的延迟。
20140228-13:55:03:834 Trace <thread:1> thread pool request start
20140228-13:55:03:839 Trace <thread:3> thread pool request invoking delegate
20140228-13:55:04:848 Trace <thread:3> thread pool request invoking set
20140228-13:55:04:853 Trace <thread:3> thread pool request set complete
20140228-13:55:27:443 Trace <thread:1> ExecuteWithTimeout returns
我从WaitOne()检查返回状态,它返回true表示收到信号(没有超时)
我意识到您无法控制何时计划运行某个线程,但这会在应用程序关闭时发生,而其他情况不会发生。此外,等待23秒的线程被安排运行似乎过度。
在i5四核3GHz 64位,.Net 4.0,Windows 7旗舰版上运行
我错过了什么?