I have created a thread running a certain method. But sometimes I would like to kill the thread even if it is still working. How can I do this? I tried Thread.Abort() but it shows up a messagebox saying "Thread aborted". What should I do?
相关问题
- Sorting 3 numbers without branching [closed]
- Graphics.DrawImage() - Throws out of memory except
- Why am I getting UnauthorizedAccessException on th
- 求获取指定qq 资料的方法
- How to know full paths to DLL's from .csproj f
It is not a good idea to kill a thread. It is better to signal that it should stop and let it end gracefully. There are various different ways of doing this.
Thread.Interrupt
to poke it if it is blocked.WaitHandle
class to send a signal.There is no need for me to rehash how each method can be used since I have already done so in this answer.
Do not call
Thread.Abort()
!Thread.Abort
is dangerous. Instead you should cooperate with the thread so that it can be peacefully shut down. The thread needs to be designed so that it can be told to kill itself, for instance by having a booleankeepGoing
flag that you set to false when you want the thread to stop. The thread would then have something likeIf the thread may block in a
Sleep
orWait
then you can break it out of those functions by callingThread.Interrupt()
. The thread should then be prepared to handle aThreadInterruptedException
:The most correct and thread-safe way is to use a WaitHandle to signal to the thread when it's supposed to stop. I mostly use ManualResetEvent.
In your thread, you can have:
where
this.flag
is an instance of ManualResetEvent. This means that you can callthis.flag.Set()
from outside the thread to stop the loop.The WaitOne method will only return true when the flag is set. Otherwise, it will time out after the specified timeout (100 ms in the example) and the thread will run through the loop once more.
You should really only call Abort() as a last resort. You can use a variable to sync this thread instead:
This allows your thread to cleanly finish what it was doing, leaving your app in a known good state.
I agree to Jon B
Aborting a thread is a very bad idea, since you cannot determine what the thread was doing at the time of the abort.
Instead, have a property that the thread can check, and that your external code can set. Let the thread check this boolean property when it's at a safe place to exit.