Change events args
This commit is contained in:
@ -44,6 +44,7 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers
|
||||
|
||||
private async Task DoStartStepAsync()
|
||||
{
|
||||
DateTime startedAt = default;
|
||||
IEnumerable<Operation>? operations = null;
|
||||
|
||||
using var context = HeadquartersService.GetNewContext();
|
||||
@ -53,7 +54,8 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers
|
||||
using var transaction = await context.Database.BeginTransactionAsync();
|
||||
try
|
||||
{
|
||||
await HeadquartersService.SetCampaignStartedAsync(context, campaign.Id);
|
||||
startedAt = DateTime.UtcNow;
|
||||
await HeadquartersService.SetCampaignStartedAsync(context, campaign.Id, startedAt);
|
||||
|
||||
await ProgressStepAsync(context, (int)Step.ExecutionWait);
|
||||
|
||||
@ -80,6 +82,8 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers
|
||||
}
|
||||
|
||||
State = IManager.ManagerState.Started;
|
||||
|
||||
InvokeOnCampaignStarted(startedAt);
|
||||
}
|
||||
|
||||
private async Task DoExecutionWaitStepAsync()
|
||||
@ -102,6 +106,8 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers
|
||||
{
|
||||
if (resultWaitState.HasCampaignOperation(campaign.Id)) return;
|
||||
|
||||
DateTime endedAt = default;
|
||||
|
||||
using var context = HeadquartersService.GetNewContext();
|
||||
var executionStrategy = context.Database.CreateExecutionStrategy();
|
||||
await executionStrategy.ExecuteAsync(async () =>
|
||||
@ -111,7 +117,8 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers
|
||||
{
|
||||
await ProgressStepAsync(context, (int)Step.End);
|
||||
|
||||
await HeadquartersService.SetCampaignEndedAsync(context, campaign.Id);
|
||||
endedAt = DateTime.UtcNow;
|
||||
await HeadquartersService.SetCampaignEndedAsync(context, campaign.Id, endedAt);
|
||||
|
||||
await transaction.CommitAsync();
|
||||
}
|
||||
@ -124,6 +131,8 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers
|
||||
});
|
||||
|
||||
State = IManager.ManagerState.Ended;
|
||||
|
||||
InvokeOnCampaignEnded(endedAt, string.Empty);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -44,6 +44,7 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers
|
||||
|
||||
private async Task DoStartStepAsync()
|
||||
{
|
||||
DateTime startedAt = default;
|
||||
IEnumerable<Operation>? operations = null;
|
||||
|
||||
using var context = HeadquartersService.GetNewContext();
|
||||
@ -53,7 +54,8 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers
|
||||
using var transaction = await context.Database.BeginTransactionAsync();
|
||||
try
|
||||
{
|
||||
await HeadquartersService.SetCampaignStartedAsync(context, campaign.Id);
|
||||
startedAt = DateTime.UtcNow;
|
||||
await HeadquartersService.SetCampaignStartedAsync(context, campaign.Id, startedAt);
|
||||
|
||||
await ProgressStepAsync(context, (int)Step.ExecutionWait);
|
||||
|
||||
@ -80,6 +82,8 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers
|
||||
}
|
||||
|
||||
State = IManager.ManagerState.Started;
|
||||
|
||||
InvokeOnCampaignStarted(startedAt);
|
||||
}
|
||||
|
||||
private async Task DoExecutionWaitStepAsync()
|
||||
@ -102,6 +106,8 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers
|
||||
{
|
||||
if (resultWaitState.HasCampaignOperation(campaign.Id)) return;
|
||||
|
||||
DateTime endedAt = default;
|
||||
|
||||
using var context = HeadquartersService.GetNewContext();
|
||||
var executionStrategy = context.Database.CreateExecutionStrategy();
|
||||
await executionStrategy.ExecuteAsync(async () =>
|
||||
@ -111,7 +117,8 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers
|
||||
{
|
||||
await ProgressStepAsync(context, (int)Step.End);
|
||||
|
||||
await HeadquartersService.SetCampaignEndedAsync(context, campaign.Id);
|
||||
endedAt = DateTime.UtcNow;
|
||||
await HeadquartersService.SetCampaignEndedAsync(context, campaign.Id, endedAt);
|
||||
|
||||
await transaction.CommitAsync();
|
||||
}
|
||||
@ -124,6 +131,8 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers
|
||||
});
|
||||
|
||||
State = IManager.ManagerState.Ended;
|
||||
|
||||
InvokeOnCampaignEnded(endedAt, string.Empty);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,6 +4,10 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers
|
||||
{
|
||||
public interface IManager
|
||||
{
|
||||
public delegate void CampaignStarted(int campaignId, DateTime startedAt);
|
||||
public delegate void CampaignProgressStep(int campaignId, int step, int progress);
|
||||
public delegate void CampaignEnded(int campaignId, Campaign.CampaignType type, DateTime endedAt, string failureReason);
|
||||
|
||||
public enum ManagerState
|
||||
{
|
||||
Created,
|
||||
@ -15,8 +19,9 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers
|
||||
|
||||
public ManagerState State { get; }
|
||||
|
||||
event Action<Campaign> OnCampaignStarted;
|
||||
event Action<Campaign> OnCampaignProgressStep;
|
||||
event CampaignStarted OnCampaignStarted;
|
||||
event CampaignProgressStep OnCampaignProgressStep;
|
||||
event CampaignEnded OnCampaignEnded;
|
||||
|
||||
Task ProcessAsync();
|
||||
|
||||
|
||||
@ -15,42 +15,36 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers
|
||||
protected readonly ResultWaitState resultWaitState = resultWaitState;
|
||||
protected readonly Campaign campaign = campaign;
|
||||
|
||||
private IManager.ManagerState state;
|
||||
private HeadquartersService? headquartersService;
|
||||
|
||||
public Campaign Campaign => campaign;
|
||||
|
||||
public IManager.ManagerState State
|
||||
{
|
||||
get => state;
|
||||
set
|
||||
{
|
||||
if (state != value)
|
||||
{
|
||||
state = value;
|
||||
|
||||
if (state == IManager.ManagerState.Started)
|
||||
{
|
||||
OnCampaignStarted?.Invoke(campaign);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
public IManager.ManagerState State { get; protected set; }
|
||||
|
||||
protected HeadquartersService HeadquartersService => headquartersService ??= scope.ServiceProvider.GetRequiredService<HeadquartersService>();
|
||||
|
||||
protected abstract int StepCount { get; }
|
||||
|
||||
public event Action<Campaign> OnCampaignStarted;
|
||||
public event Action<Campaign>? OnCampaignProgressStep;
|
||||
public event IManager.CampaignStarted OnCampaignStarted;
|
||||
public event IManager.CampaignProgressStep OnCampaignProgressStep;
|
||||
public event IManager.CampaignEnded OnCampaignEnded;
|
||||
|
||||
public abstract Task ProcessAsync();
|
||||
|
||||
public async Task EndWithFailAsync(Exception e)
|
||||
{
|
||||
await HeadquartersService.SetCampaignEndedWithFailAsync(campaign.Id, e.CombineMessages());
|
||||
var endedAt = DateTime.UtcNow;
|
||||
var failureReason = e.CombineMessages();
|
||||
await HeadquartersService.SetCampaignEndedWithFailAsync(campaign.Id, endedAt, failureReason);
|
||||
|
||||
State = IManager.ManagerState.Ended;
|
||||
|
||||
InvokeOnCampaignEnded(endedAt, failureReason);
|
||||
}
|
||||
|
||||
protected void InvokeOnCampaignStarted(DateTime startedAt)
|
||||
{
|
||||
OnCampaignStarted?.Invoke(campaign.Id, startedAt);
|
||||
}
|
||||
|
||||
protected async Task ProgressStepAsync(int step)
|
||||
@ -59,13 +53,18 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers
|
||||
await ProgressStepAsync(context, step);
|
||||
}
|
||||
|
||||
protected void InvokeOnCampaignEnded(DateTime endedAt, string failureReason)
|
||||
{
|
||||
OnCampaignEnded?.Invoke(campaign.Id, campaign.Type, endedAt, failureReason);
|
||||
}
|
||||
|
||||
protected async Task ProgressStepAsync(HcsDbContext context, int step)
|
||||
{
|
||||
campaign.Step = step;
|
||||
campaign.Progress = Convert.ToInt32(((step + 1) / (float)StepCount * 100));
|
||||
await HeadquartersService.UpdateCampaignStepAndProgressAsync(context, campaign);
|
||||
|
||||
OnCampaignProgressStep?.Invoke(campaign);
|
||||
OnCampaignProgressStep?.Invoke(campaign.Id, campaign.Step, campaign.Progress);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user