Skip to content

Commit 93f489d

Browse files
committed
feat: general improvements and minor bugs
1 parent 2223025 commit 93f489d

4 files changed

Lines changed: 114 additions & 5 deletions

File tree

src/WebExpress.WebCore/WebTask/ITaskManager.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ namespace WebExpress.WebCore.WebTask
99
/// </summary>
1010
public interface ITaskManager : IComponentManager
1111
{
12+
/// <summary>
13+
/// Event is triggered when a task's changes.
14+
/// </summary>
15+
event EventHandler<TaskEventArgs> TaskChanged;
16+
1217
/// <summary>
1318
/// Returns the collection of tasks.
1419
/// </summary>

src/WebExpress.WebCore/WebTask/Task.cs

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ namespace WebExpress.WebCore.WebTask
1111
public class Task : ITask
1212
{
1313
private int _progress;
14+
private string _message;
1415

1516
/// <summary>
1617
/// Event is triggered when the task is executed.
@@ -22,6 +23,16 @@ public class Task : ITask
2223
/// </summary>
2324
public event EventHandler<TaskEventArgs> Finish;
2425

26+
/// <summary>
27+
/// Event is triggered when the progress changes.
28+
/// </summary>
29+
public event EventHandler<TaskEventArgs> ProgressChanged;
30+
31+
/// <summary>
32+
/// Event is triggered when the message changes.
33+
/// </summary>
34+
public event EventHandler<TaskEventArgs> MessageChanged;
35+
2536
/// <summary>
2637
/// Returns the id of the task.
2738
/// </summary>
@@ -47,14 +58,35 @@ public class Task : ITask
4758
/// </summary>
4859
public int Progress
4960
{
50-
get => _progress;
51-
set => _progress = Math.Min(value, 100);
61+
get { return _progress; }
62+
set
63+
{
64+
var newValue = Math.Min(value, 100);
65+
if (_progress != newValue)
66+
{
67+
_progress = newValue;
68+
// trigger progress changed event
69+
OnProgressChanged();
70+
}
71+
}
5272
}
5373

5474
/// <summary>
5575
/// Returns or sets a message that provides information about the processing.
5676
/// </summary>
57-
public string Message { get; set; }
77+
public string Message
78+
{
79+
get { return _message; }
80+
set
81+
{
82+
if (_message != value)
83+
{
84+
_message = value;
85+
// trigger message changed event
86+
OnMessageChanged();
87+
}
88+
}
89+
}
5890

5991
/// <summary>
6092
/// Initializes a new instance of the class.
@@ -72,15 +104,31 @@ public Task(string id, params object[] args)
72104
/// </summary>
73105
protected virtual void OnProcess()
74106
{
75-
Process?.Invoke(this, new TaskEventArgs());
107+
Process?.Invoke(this, new TaskEventArgs(this, 0));
76108
}
77109

78110
/// <summary>
79111
/// Triggered when the task is complete.
80112
/// </summary>
81113
protected virtual void OnFinish()
82114
{
83-
Finish?.Invoke(this, new TaskEventArgs());
115+
Finish?.Invoke(this, new TaskEventArgs(this, 100));
116+
}
117+
118+
/// <summary>
119+
/// Triggered when the progress changes.
120+
/// </summary>
121+
protected virtual void OnProgressChanged()
122+
{
123+
ProgressChanged?.Invoke(this, new TaskEventArgs(this, Progress));
124+
}
125+
126+
/// <summary>
127+
/// Triggered when the message changes.
128+
/// </summary>
129+
protected virtual void OnMessageChanged()
130+
{
131+
MessageChanged?.Invoke(this, new TaskEventArgs(this, Progress, Message));
84132
}
85133

86134
/// <summary>

src/WebExpress.WebCore/WebTask/TaskEventArgs.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,32 @@ namespace WebExpress.WebCore.WebTask
77
/// </summary>
88
public class TaskEventArgs : EventArgs
99
{
10+
/// <summary>
11+
/// Returns the related task.
12+
/// </summary>
13+
public ITask Task { get; }
14+
15+
/// <summary>
16+
/// Returns the current progress (if relevant).
17+
/// </summary>
18+
public int Progress { get; }
19+
20+
/// <summary>
21+
/// Returns the current or new message (if relevant).
22+
/// </summary>
23+
public string Message { get; }
24+
25+
/// <summary>
26+
/// Initializes a new instance of the class.
27+
/// </summary>
28+
/// <param name="task">The related task.</param>
29+
/// <param name="progress">The current progress.</param>
30+
/// <param name="message">The current or new message.</param>
31+
public TaskEventArgs(ITask task, int progress = 0, string message = null)
32+
{
33+
Task = task;
34+
Progress = progress;
35+
Message = message;
36+
}
1037
}
1138
}

src/WebExpress.WebCore/WebTask/TaskManager.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ public class TaskManager : ITaskManager, ISystemComponent
1616
private readonly IHttpServerContext _httpServerContext;
1717
private readonly TaskDictionary _dictionary = [];
1818

19+
/// <summary>
20+
/// Event is triggered when a task's changes.
21+
/// </summary>
22+
public event EventHandler<TaskEventArgs> TaskChanged;
23+
1924
/// <summary>
2025
/// Returns the collection of tasks.
2126
/// </summary>
@@ -79,6 +84,10 @@ public ITask CreateTask(string id, params object[] args)
7984
}
8085

8186
var task = ComponentActivator.CreateInstance<Task>(_httpServerContext, _componentHub, [id, args]);
87+
88+
// register events for the newly created task
89+
task.ProgressChanged += OnTaskChanged;
90+
8291
_dictionary.Add(key, task);
8392

8493
return task;
@@ -115,6 +124,10 @@ public ITask CreateTask<TTask>(string id, EventHandler<TaskEventArgs> handler, p
115124
}
116125

117126
var task = ComponentActivator.CreateInstance<TTask>(_httpServerContext, _componentHub, [id, args]);
127+
128+
// register events for the newly created task
129+
task.ProgressChanged += OnTaskChanged;
130+
118131
_dictionary.Add(key, task);
119132

120133
task.Process += handler;
@@ -130,6 +143,12 @@ public void RemoveTask(ITask task)
130143
{
131144
var key = task?.Id.ToLower();
132145

146+
if (_dictionary.TryGetValue(key, out var storedTask) && storedTask is Task t)
147+
{
148+
// unregister events to prevent memory leaks
149+
t.ProgressChanged -= OnTaskChanged;
150+
}
151+
133152
_dictionary.Remove(key);
134153
}
135154

@@ -140,5 +159,15 @@ public void Dispose()
140159
{
141160
GC.SuppressFinalize(this);
142161
}
162+
163+
/// <summary>
164+
/// Handles the changed event from a task.
165+
/// </summary>
166+
/// <param name="sender">The sender.</param>
167+
/// <param name="e">The event arguments.</param>
168+
private void OnTaskChanged(object sender, TaskEventArgs e)
169+
{
170+
TaskChanged?.Invoke(sender, e);
171+
}
143172
}
144173
}

0 commit comments

Comments
 (0)