从AutoResetEvent.WaitOne(超时)调用唤醒线程延迟

时间:2014-02-28 20:29:52

标签: .net multithreading autoresetevent

我需要拨打第三方图书馆,但我不能总是等待结果。我决定在后台线程上进行呼叫,然后等待有限的时间来完成呼叫(最好等待,但我不能永远等待)。我的方法如下。我传入一个调用第三方方法的代理

        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旗舰版上运行

我错过了什么?

0 个答案:

没有答案