我需要调用 3rd 方库,但我不能总是等待结果。我决定在后台线程上进行调用,然后在有限的时间内等待调用完成(最好等待,但我不能永远等待)。我的方法如下。我传入一个调用 3rd 方方法的委托
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 Ultimate 上运行
我错过了什么?