Как уже отмечалось, все, что вам нужно для того, чтобы вызвать Abort
является ссылкой на поток (так же, как и любой другой объект в .NET).
Однако
Вы должны серьезно рассмотреть вопрос о переосмыслении этого подхода. В общем, вызов Abort
обескуражен, так как он не дает целевой теме достаточную возможность достичь точки остановки. Хотя это иногда необходимо (или единственный вариант), это почти всегда лучшая идея спросить целевую нить, чтобы остановить (как правило, через volatile bool
, а не заставляя его, как это.
Например,
public class ThreadClass
{
private volatile bool stopRequested;
private Thread thread;
public void Start()
{
stopRequested = false;
thread = new Thread(ThreadMethod);
thread.Start();
}
public void Stop()
{
stopRequested = true;
if(!thread.Join(5000)) thread.Abort(); // forcefully abort if not
// completed within 5 seconds
}
private void ThreadMethod()
{
}
}
Ваш код затем переходит в ThreadMethod
. Внутри метода периодически проверяйте значение stopRequested
.Если оно верно, выполните любую очистку (если есть) и изящно вернитесь из потока. Если содержимое представляет собой цикл, общий практика заключается в том, чтобы поместить проверку в начале цикла (при условии, что петля достаточно плотная) и выйдите раньше, если значение равно true
. Точное размещение действительно зависит от кода, но общая идея заключается в том, что его следует проверять достаточно часто, чтобы поток был довольно быстро после его установки, независимо от того, когда это произойдет.
хорошее описание. я очень помог мне – vishnu