2015-10-06 69 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來清楚地說明該情況,並詳細說明該代碼示例現在的功能以及與您希望的功能有何不同。