У меня есть приложение, которое требует времени для закрытия. Когда я закрываю приложение, он пытается удалить несколько потоков, которые выполняют TCP-сканирование, попытки WCF P2P и т.д. Проблема заключается в потоке WCF, который останавливается на методе около 17 секунд.
IP2PAuthenticationService server;
ChannelFactory<IP2PAuthenticationService> channelFactory;
channelFactory = new ChannelFactory<IP2PAuthenticationService>(binding, endpointAddress);
server = channelFactory.CreateChannel();
string result = server.SendMyDetails(myContract, "foo");
Итак, все это происходит внутри потока. Когда форма закрывается, она пытается уничтожить поток
if (prospectCrawlerThread != null)
{
prospectCrawlerThread.Abort();
//prospectCrawlerThread.Join();
prospectCrawlerThread = null;
}
Я подтвердил это, раскомментировав .Join()
, а также приостановив отладку и увидев потоки, которые все еще работают.
Какой лучший способ избавиться от этой темы?
Изменить: настройка потока на фон, казалось, ускорилась
prospectCrawlerThread.IsBackground = true;
IsBackgroundThread = true автоматически прекратит поток, когда форма закрывается, поэтому я думаю, что вы ищете, если хотите просто убить его.
Стоит отметить, что Thread.Abort
обычно является плохой практикой, и его следует избегать:
"прервать нить - это чистое зло. Старайтесь никогда этого не делать!"
Эрик Липперт, Сказочные приключения в кодировании"Thread.Abort - признак плохо разработанной программы"
Питер Ритчи Блог MVP