WaitHandle WaitOne Return
WaitHandle WaitOne Return
WaitHandle WaitOne(int timeout)
return 是什么时候?超时后是否 return ?我在网上看到一些代码建议在执行退出前进行一些清理的逻辑时轮询 WaitOne()
。这意味着当超时结束时 WaitOne() 不会 return;相反,它 return 是否在调用后立即发出信号。
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
发出信号的方法。
"I want to essentially stop blocking the calling thread while it is waiting even before the WaitHandle times out or is signaled" -- 您希望线程在什么情况下变为畅通?您是否已有正在使用的 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 来改进问题,清楚地说明该场景,并详细说明该代码示例现在的作用以及它与您的代码示例有何不同想要它做。
WaitHandle WaitOne(int timeout)
return 是什么时候?超时后是否 return ?我在网上看到一些代码建议在执行退出前进行一些清理的逻辑时轮询 WaitOne()
。这意味着当超时结束时 WaitOne() 不会 return;相反,它 return 是否在调用后立即发出信号。
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
发出信号的方法。
"I want to essentially stop blocking the calling thread while it is waiting even before the WaitHandle times out or is signaled" -- 您希望线程在什么情况下变为畅通?您是否已有正在使用的 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 来改进问题,清楚地说明该场景,并详细说明该代码示例现在的作用以及它与您的代码示例有何不同想要它做。