-
Notifications
You must be signed in to change notification settings - Fork 21
/
BaseTaskActor.cs
135 lines (113 loc) · 4.88 KB
/
BaseTaskActor.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
using Caliburn.Micro;
using FeatureAdmin.Core.Models.Enums;
using FeatureAdmin.Messages;
using System;
namespace FeatureAdmin.Core.Models.Tasks
{
public abstract class BaseTaskActor : Actors.BaseActor
{
protected readonly IEventAggregator eventAggregator;
public BaseTaskActor(IEventAggregator eventAggregator, Guid id)
: this(eventAggregator, "Generic title to be overwritten", id)
{
}
public BaseTaskActor(IEventAggregator eventAggregator, string title, Guid id)
{
this.eventAggregator = eventAggregator;
Status = TaskStatus.Started;
Id = id;
Title = title;
Start = null;
End = null;
}
protected override void ReceiveCancelMessage(CancelMessage message)
{
if (!TaskCanceled) // prevent multiple log entries
{
if (message.CancelCompleteTask)
{
HandleCancelation(message);
}
Status = TaskStatus.Canceled;
CancelationMessage = message.CancelationMessage;
End = DateTime.Now;
var logEndMsg = new LogMessage(message.LogLevel,
string.Format("{0} {1}", Status.ToString(), message.CancelationMessage)
);
eventAggregator.PublishOnUIThread(logEndMsg);
var progressMsg = new ProgressMessage(
Id,
1d,
string.Format("'{0}' '{1}'! {2}", Title, Status.ToString(), message.CancelationMessage));
eventAggregator.PublishOnUIThread(progressMsg);
}
}
protected abstract void HandleCancelation(CancelMessage cancelMessage);
public string ElapsedTime
{
get
{
return (End == null ? DateTime.Now : End.Value).Subtract(
Start == null ? DateTime.Now : Start.Value).ToString("c");
}
}
public DateTime? End { get; set; }
public Guid Id { get; }
public abstract double PercentCompleted { get; }
public DateTime? Start { get; set; }
public TaskStatus Status { get; protected set; }
public abstract string StatusReport { get; }
public string Title { get; protected set; }
protected void SendProgress()
{
if (!TaskCanceled)
{
if (PercentCompleted > 0d && Status == TaskStatus.Started)
{
Status = TaskStatus.InProgress;
}
if (PercentCompleted >= 1d && Status != TaskStatus.Failed && Status != TaskStatus.Canceled
&& Status != TaskStatus.Completed)
{
Status = TaskStatus.Completed;
}
if (PercentCompleted != 1d && Start == null)
{
Start = DateTime.Now;
var logMsg = new LogMessage(LogLevel.Information,
string.Format("Started '{1}' (ID: '{0}')", Id, Title)
);
eventAggregator.PublishOnUIThread(logMsg);
}
if (PercentCompleted >= 1d && End == null)
{
End = DateTime.Now;
var logEndMsg = new LogMessage(Core.Models.Enums.LogLevel.Information,
string.Format("{0} {1}", Status.ToString(), StatusReport)
);
eventAggregator.PublishOnUIThread(logEndMsg);
// as task list ist deleted after restart, no need to delete tasks here
}
ProgressMessage progressMsg;
if (PercentCompleted < 1d)
{
if (Status == TaskStatus.InProgress || (Status == TaskStatus.Started && PercentCompleted == 0))
{
progressMsg = new ProgressMessage(Id, PercentCompleted, string.Format("'{0}' in progress ({1:F0}%), please wait ...", Title, PercentCompleted * 100, Status.ToString()));
}
else
{
progressMsg = new ProgressMessage(Id, PercentCompleted, string.Format("Attention! '{0}' '{2}' ({1:F0}%), please wait ...", Title, PercentCompleted * 100, Status.ToString()));
var logMsg = new LogMessage(LogLevel.Warning, progressMsg.Title);
eventAggregator.PublishOnUIThread(logMsg);
}
}
else
{
progressMsg = new ProgressMessage(Id, PercentCompleted, string.Format("'{0}' '{2}'! Elapsed time: {1}", Title, ElapsedTime, Status.ToString()));
}
eventAggregator.PublishOnUIThread(progressMsg);
}
}
}
}