2015-10-06 99 views
-1

WaitHandle WaitOne(int timeout)是什么时候返回的?超时时间结束后是否返回?我看到一些代码在线,这表明在执行退出前执行一些清理的逻辑时轮询WaitOne()。这意味着WaitOne()在超时过后不会返回;而是在它被调用后立即返回信号。WaitHandle WaitOne退货

public void SomeMethod() 
{ 
    while (!yourEvent.WaitOne(POLLING_INTERVAL)) 
    { 
    if (IsShutdownRequested()) 
    { 
     // Add code to end gracefully here. 
    } 
    } 
    // Your event was signaled so now we can proceed. 
} 

我想在这里实现的是使用CancellationToken而它阻塞调用线程的信号的WaitHandle的方式。

+2

[您是否阅读过手册?](https://msdn.microsoft.com/en-us/library/cc189907(v = vs.110).aspx) – MickyD

+0

希望它在事件在合理的时间。如果没有,那么你有两个问题。不知道该如何放入if()语句非常正常。我们不知道什么“优雅”可能意味着什么时候发生了一些非常不正常的事情。抛出一个异常通常会像它得到的那样优雅。如果你不知道该怎么做,就不要使用超时,至少你可以调试它。 –

+0

好的谢谢。我知道它会在发出信号后立即返回。那么在这种情况下,它不会在超时时间内发出信号,它将返回false并且不会返回任何异常?在这种情况下,轮询WaitOne没有意义。我希望在WaitHandle超时或正在等待之前等待时阻止调用线程。有什么建议么? – TheWolf

回答

1

“我希望在WaitHandle超时之前等待时阻止调用线程或发出信号” - 在什么情况下您希望线程变得畅通无阻?你已经有了一个CancellationToken对象吗?

如果是这样,那么你可以做这样的事情:

public void SomeMethod(CancellationToken token) 
{ 
    int waitResult; 

    while ((waitResult = WaitHandle.WaitAny(
     new [] { yourEvent, token.WaitHandle }, POLLING_INTERVAL)) == WaitHandle.WaitTimeout) 
    { 
    if (IsShutdownRequested()) 
    { 
     // Add code to end gracefully here. 
    } 
    } 
    if (waitResult == 0) 
    { 
     // Your event was signaled so now we can proceed. 
    } 
    else if (waitResult == 1) 
    { 
     // The wait was cancelled via the token 
    } 
} 

注意的是,使用WaitHandle不一定理想。 .NET具有现代的托管线程同步机制,它比WaitHandle(它基于本地OS对象导致更大的开销)更高效地工作。但是,如果您必须首先使用WaitHandle,那么上述可能是将当前实施扩展到CancellationToken的适当方式。

如果上述内容不能解决您的问题,请通过提供a good, minimal, complete code example来清楚地说明该情况,并详细说明该代码示例现在的功能以及与您希望的功能有何不同。