Код: Выделить всё
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
}
}
Некоторые вещи, которые следует знать:
- Моя логика ContinueWith срабатывает, я вижу, что время выполнен вход в консоль.
- Я не вижу никаких журналов или исключений, возникающих в задаче загрузки, я думал, что увижу их, как я .wait(), если таковой существует.
- Я подхожу к логике .wait() и продолжаю пройдя мимо него, меня не заблокируют навсегда.
- Я использую Task.Factory.StartNew, потому что я этого не сделал хочу просто поместить эту многоминутную задачу в пул потоков без опции задачи LongRunning. Я думаю, возможно, я не настроил его должным образом. Я был бы рад разделить это на словарь. Подсчитайте количество задач.
- Во время выполнения все работает, я могу использовать все члены моего словаря вещей. Кажется, при доступе к чему-либо не возникает никаких исключений.
Подробнее здесь: https://stackoverflow.com/questions/785 ... nning-task