У меня есть объект диспетчера, который обрабатывает запуск и завершение задач, когда запросы поступают в мой сервис через канал.
Мой метод при остановке выглядит следующим образом:
protected override void OnStop()
{
try
{
Task t = CalculationServiceProcess.Instance.Shutdown();
t.Wait();
}
catch (AggregateException ae)
{
foreach (Exception e in ae.InnerExceptions)
{
Debug.WriteLine(e.Message);
}
}
}
Мой метод Instance.Shutdown выглядит следующим образом:
public Task Shutdown()
{
_shutdownTokenSource.Cancel();
Task t = _dispatcher.Shutdown();
_shutdownTokenSource.Dispose();
///some more code
return t;
}
А метод отключения диспетчеров выглядит следующим образом:
public Task Shutdown()
{
Task t = Task.WhenAll(_dispatchedItems.Select((item => item.Value.Task)).ToArray());
_dispatchedItems.Clear();
return t;
}
Интересно, будет ли вызван метод dispose и будет ли гарантированно выполняться «// еще какой-то код»?Или когда задание WhenAll завершится, мой метод t.Wait () вернется и OnStop завершит выполнение, а служба будет закрыта до выполнения этого кода?