Ok, what I'm doing now (using your ideas) and seems to work is this:
I declared a list of ManualResetEvent:
Private m_waitHandles As List(Of Threading.ManualResetEvent)
The process accepts incoming Tcp connections and starts one thread on each connection. So at the new client handler I've added this code:
Dim waitHandle As Threading.ManualResetEvent
waitHandle = New Threading.ManualResetEvent(True)
SyncLock (DirectCast(m_waitHandles, IList).SyncRoot)
m_waitHandles.Add(waitHandle)
End SyncLock
''# Do all the work
StoppableMethod()
SyncLock (DirectCast(m_waitHandles, IList).SyncRoot)
waitHandle = m_waitHandles.Item(Threading.WaitHandle.WaitAny(m_waitHandles.ToArray()))
End SyncLock
waitHandle.Reset()
NonStoppableMethod()
waitHandle.Set()
SyncLock (DirectCast(m_waitHandles, IList).SyncRoot)
m_waitHandles.Remove(waitHandle)
End SyncLock
The last thing done is to modify the Stop method to be sure that the Stop operation will not done with any thread inside the NonStoppableMethod:
SyncLock (DirectCast(m_waitHandles, IList).SyncRoot)
If m_waitHandles.Count > 0 Then
Threading.WaitHandle.WaitAll(m_waitHandles.ToArray())
End If
End SyncLock
I'm not sure that this is done in a right way because it's the first time I deal with things like that. Do you feel that this is ok and is a good approach?
Thanks to all, mates!