Нечто подобное сделает свое дело:
public interface IStateful1 : IService
{
Task MyMethod();
}
internal sealed class Stateful1 : StatefulService, IStateful1
{
private bool isReady = false;
public Stateful1(StatefulServiceContext context)
: base(context)
{ }
public Task MyMethod()
{
if(!isReady)
throw new NotImplementedException(); // Probably throw or return something more meaningful :-)
return Task.CompletedTask; // Do your thing here
}
protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
{
return new ServiceReplicaListener[0];
}
protected override async Task RunAsync(CancellationToken cancellationToken)
{
await Task.Run(() => {
// Simulation of some work
Thread.Sleep((int)TimeSpan.FromMinutes(5).TotalMilliseconds);
});
isReady = true;
}
}
В этой настройке импорт из БД в надежную коллекцию выполняется методом RunAsync
.
К сожалению, AFAIKнет способа подключить слушателей связи позже.Это упростило бы задачу.
Если бы CreateServiceReplicaListeners
была бы асинхронной операцией, мы могли бы ожидать здесь задачу инициализации, но сейчас не можем.Использование .Wait()
не сработает, так как сообщит, что запуск экземпляра занимает много времени, и пометит его как нездоровый.
Полный обзор жизненного цикла службы можно найти в Документы