Процесс никогда не завершается после изменения логики загрузки на долго выполняющуюся задачу.C#

Место общения программистов C#
Anonymous
Процесс никогда не завершается после изменения логики загрузки на долго выполняющуюся задачу.

Сообщение Anonymous »

У меня есть сервер Net Framework. Частью процесса загрузки этого сервера является настройка набора статических переменных. По окончании жизни сервера мы отменяем задачи, утилизируем разное одноразовое оборудование и вообще разносим вещи. Один аспект моего кода требовал очень много времени для запуска, поэтому я изменил его на ленивую реализацию + фоновую задачу, чтобы «прикоснуться» ко всем ленивым вещам, чтобы через N минут после запуска все они были готовы.

Код: Выделить всё

public class MyClass
{
private ConcurrentDictionary dictionary = new ConcurrentDictionary();
private CancellationTokenSource cts = new CancellationTokenSource();
private Task bootingTask;

public void Boot()
{
// Add to the dictionary of all the lazy things
// For example: dictionary.TryAdd(thingKey, new Lazy(CreateThing));
// Note: Replace CreateThing with your actual method to create a Thing object

bootingTask = Task.Factory.StartNew(() =>
{
foreach(var item in dictionary.Values)
{
// (lazy initter)
var _ = item.Value;
}
}, cts.Token, TaskCreationOptions.LongRunning)
.ContinueWith(t =>
{
// Log how long the task took
// For example: Console.WriteLine($"Task took: {t.Result} ms");
});
}

public void Shutdown()
{
// Cancel from the Task Cancellation source
cts.Cancel();

// Checks if the bootingTask is not null and waits for it
if(bootingTask != null)
{
bootingTask.Wait();
}

// Dispose of the task cancellation source and the task
cts.Dispose();
bootingTask.Dispose();

dictionary.Values.foreach(disposeThing);
// Other stuff
// ... We do reach here
}
}
Проблема, с которой я столкнулся, заключается в том, что после этого изменения мой серверный процесс не завершается, что плохо, поскольку все процессы должны завершиться, прежде чем мое приложение перезапустится с помощью NSSM.
Некоторые вещи, которые следует знать:
  • Моя логика ContinueWith срабатывает, я вижу, что время выполнен вход в консоль.
  • Я не вижу никаких журналов или исключений, возникающих в задаче загрузки, я думал, что увижу их, как я .wait(), если таковой существует.
  • Я подхожу к логике .wait() и продолжаю пройдя мимо него, меня не заблокируют навсегда.
  • Я использую Task.Factory.StartNew, потому что я этого не сделал хочу просто поместить эту многоминутную задачу в пул потоков без опции задачи LongRunning. Я думаю, возможно, я не настроил его должным образом. Я был бы рад разделить это на словарь. Подсчитайте количество задач.
  • Во время выполнения все работает, я могу использовать все члены моего словаря вещей. Кажется, при доступе к чему-либо не возникает никаких исключений.
Что может быть причиной моего процесса никогда не быть убитым?

Подробнее здесь: https://stackoverflow.com/questions/785 ... nning-task

Вернуться в «C#»