Как уже упоминалось, возврат из RunAsync завершит только этот метод, но служба продолжит работу и, следовательно, не будет удалена.
DeleteServiceAsync
, безусловно, это путь, однако это не совсем такпросто, просто позвонив, потому что, если вы не будете осторожны, он заблокирует текущий поток (особенно в локальном кластере разработчиков).Скорее всего, вы также получите несколько кратковременных предупреждений о работоспособности, связанных с тем, что RunAsync требует много времени для завершения и / или не соответствует целевому размеру реплики.
В любом случае - решение довольно простое - просто сделайте это:
private async Task DeleteSelf(CancellationToken cancellationToken)
{
using (var client = new FabricClient())
{
await client.ServiceManager.DeleteServiceAsync(new DeleteServiceDescription(this.Context.ServiceName), TimeSpan.FromMinutes(1), cancellationToken);
}
}
Затем в последней строке моего метода RunAsync я вызываю:
await DeleteSelf(cancellationToken).ConfigureAwait(false);
ConfigureAwait(false)
поможет с проблемой взаимоблокировки, поскольку он по существу вернется к новому контексту синхронизации потока - т.е. не попытается вернуться к «контексту вызывающего».