Прежде всего, глядя на ваш код, кажется, что поток может немедленно остановиться, если UrlListview.Items
не содержит никаких элементов.В этом случае вы можете пропустить цикл while.
В связи с проблемой остановки потока: вызов CommentingThread.Abort()
вызовет ThreadAbortException
, что фактически приводит к сбою потока (см. Документы Microsoft для получения дополнительной информации).info для получения дополнительной информации. Чтобы корректно завершить поток, вы должны либо объявить CancellationTokenSource, либо логическое значение, которое может быть установлено в true
(или false
, в зависимости от вашей реализации), чтобы уведомить поток о том, что ему нужнобыть остановленным. Вот пример:
var myThread_ctoks = new CancellationTokenSource();
Thread myThread = new Thread( async () =>
{
while (!myThread_ctoks.IsCancellationRequested) // simulate many long actions
{
await Task.Delay(TimeSpan.FromSeconds(2));
Console.WriteLine("Iteration finished!");
}
});
myThread.Start(); // start the thread
await Task.Delay(TimeSpan.FromMinutes(1)); // lets do some other work
myThread_ctoks.Cancel(); // and now shut down the thread
Этот поток проверяет каждые 2 секунды, требуется ли завершение работы (потому что моделируемое действие занимает столько времени). Как только запрашивается отмена (myThread_ctoks.IsCancellationRequested установленв true) условие while будет ложным и, таким образом, поток завершится. Преимущество выполнения этого способа заключается в том, что поток будет отключен безопасным, определенным образом, поскольку он фактически корректно завершает работу и не падает.
Относительно того, как вы можете приостановить и возобновить поток. Вы также можете использоватьпеременная для управления этим, просто проверяя, разрешено ли потоку выполнять работу или нет.Если он остановится, вы просто подождите секунду в цикле while.
Также есть возможность использовать Thread.Suspend()
и Thread.Resume()
.Однако, согласно Microsoft , существует вероятность, что вы можете заблокировать другие потоки при определенных обстоятельствах.Кроме того, вы не знаете точно, какой код выполняется, когда вы его прерываете.Что может привести к дальнейшему неожиданному поведению.Вот почему я думаю, что лучше всего использовать переменную для управления поведением потока.