Is there a standard way to close out an application "cleanly" while some WaitHandle
objects may be in the state of a current blocking call to WaitOne
?
For example, there may be a background thread that is spinning along in a method like this:
while (_request.WaitOne())
{
try
{
_workItem.Invoke();
}
finally
{
OnWorkCompleted();
}
}
I see no obvious way to dispose of this thread without calling Thread.Abort
(which from what I understand is discouraged). Calling Close
on the _request
object (an AutoResetEvent
), however, will throw an exception.
Currently, the thread that is running this loop has its IsBackground
property set to true
, and so the application appears to close properly. However, since WaitHandle
implements IDisposable
, I'm unsure if this is considered kosher or if that object really ought to be disposed before the app exits.
Is this a bad design? If not, how is this scenario typically dealt with?