Skip to content

Commit 96c9abf

Browse files
author
Rich Stephens
committed
Fix task running detection.
1 parent 00f787c commit 96c9abf

File tree

2 files changed

+71
-23
lines changed

2 files changed

+71
-23
lines changed

Tnfsd.NET/MainForm.cs

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,24 @@ private void setTaskRunningState()
134134
if (this.WindowState == FormWindowState.Minimized)
135135
this.Hide();
136136
}
137+
138+
private void ShowHourglass(bool show)
139+
{
140+
if (show)
141+
{
142+
this.UseWaitCursor = true;
143+
Cursor.Current = Cursors.WaitCursor;
144+
this.Enabled = false;
145+
Application.DoEvents(); // force UI refresh
146+
}
147+
else
148+
{
149+
this.UseWaitCursor = false;
150+
Cursor.Current = Cursors.Default;
151+
this.Enabled = true;
152+
Application.DoEvents();
153+
}
154+
}
137155
private void MainForm_Load(object sender, EventArgs e)
138156
{
139157
var props = TaskSchedulerManager.GetTaskProperties(TaskSchedulerManager.TaskName);
@@ -165,13 +183,17 @@ private void MainForm_Load(object sender, EventArgs e)
165183

166184
private void buttonStartTask_Click(object sender, EventArgs e)
167185
{
186+
ShowHourglass(true);
168187
TaskSchedulerManager.StartTask(TaskSchedulerManager.TaskName);
188+
ShowHourglass(false);
169189
setTaskRunningState();
170190
}
171191

172192
private void buttonStopTask_Click(object sender, EventArgs e)
173193
{
194+
ShowHourglass(true);
174195
TaskSchedulerManager.StopTask(TaskSchedulerManager.TaskName);
196+
ShowHourglass(false);
175197
setTaskRunningState();
176198
}
177199

@@ -194,7 +216,7 @@ private async void buttonCreateTask_Click(object sender, EventArgs e)
194216

195217
try
196218
{
197-
this.UseWaitCursor = true;
219+
ShowHourglass(true);
198220
buttonCreateTask.Enabled = false;
199221

200222
TaskSchedulerManager.CreateOrUpdateTask(TaskSchedulerManager.TaskName, exePath, shareFolder);
@@ -204,11 +226,6 @@ private async void buttonCreateTask_Click(object sender, EventArgs e)
204226
if (checkBoxAddFirewallException.Checked)
205227
{
206228
FirewallManager.AddFirewallException(exePath, TaskSchedulerManager.TaskName);
207-
208-
if (FirewallManager.FirewallExceptionExists(TaskSchedulerManager.TaskName))
209-
{
210-
MessageBox.Show("Firewall exception created successfully.", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
211-
}
212229
}
213230
}
214231

@@ -229,7 +246,7 @@ private async void buttonCreateTask_Click(object sender, EventArgs e)
229246
finally
230247
{
231248
buttonCreateTask.Enabled = true;
232-
this.UseWaitCursor = false;
249+
ShowHourglass(false);
233250
setTaskRunningState();
234251
}
235252
}
@@ -238,7 +255,7 @@ private async void buttonDeleteTask_Click(object sender, EventArgs e)
238255
{
239256
try
240257
{
241-
this.UseWaitCursor = true;
258+
ShowHourglass(true);
242259
buttonDeleteTask.Enabled = false;
243260

244261
TaskSchedulerManager.DeleteTask(TaskSchedulerManager.TaskName);
@@ -262,7 +279,7 @@ private async void buttonDeleteTask_Click(object sender, EventArgs e)
262279
finally
263280
{
264281
buttonDeleteTask.Enabled = true;
265-
this.UseWaitCursor = false;
282+
ShowHourglass(false);
266283
setTaskRunningState();
267284
}
268285
}
@@ -295,7 +312,7 @@ private async void buttonDownload_Click(object sender, EventArgs e)
295312
{
296313
// Continue with download and extraction
297314
buttonDownload.Enabled = false;
298-
this.UseWaitCursor = true;
315+
ShowHourglass(true);
299316

300317
try
301318
{
@@ -326,7 +343,7 @@ private async void buttonDownload_Click(object sender, EventArgs e)
326343
finally
327344
{
328345
buttonDownload.Enabled = true;
329-
this.UseWaitCursor = false;
346+
ShowHourglass(false);
330347
}
331348
}
332349
else if (result == DialogResult.No)

Tnfsd.NET/TaskSchedulerManager.cs

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
using System;
2-
using System.IO;
3-
using Microsoft.Win32.TaskScheduler;
1+
using Microsoft.Win32.TaskScheduler;
2+
using System.Diagnostics;
43

54
namespace Tnfsd.NET
65
{
@@ -50,6 +49,11 @@ public static void CreateOrUpdateTask(string taskName, string exePath, string ar
5049

5150
public static void DeleteTask(string taskName)
5251
{
52+
if (IsTaskRunning(taskName))
53+
{
54+
StopTask(taskName);
55+
}
56+
5357
using (TaskService ts = new TaskService())
5458
{
5559
var task = ts.GetTask(taskName);
@@ -68,28 +72,55 @@ public static bool TaskExists(string taskName)
6872

6973
public static bool IsTaskRunning(string taskName)
7074
{
71-
using (TaskService ts = new TaskService())
75+
using var ts = new TaskService();
76+
77+
// Always re-fetch to avoid stale state
78+
var t = ts.GetTask(taskName) ?? ts.FindTask(taskName, true);
79+
if (t == null)
80+
return false;
81+
82+
// 1) Scheduler reports Running
83+
if (t.State == TaskState.Running)
84+
return true;
85+
86+
// 2) Check if this task appears in the system's active task list
87+
if (ts.GetRunningTasks(true)
88+
.Any(rt => string.Equals(rt.Path, t.Path, System.StringComparison.OrdinalIgnoreCase)))
89+
return true;
90+
91+
// 3) Fallback: detect the actual EXE process from the ExecAction
92+
var execPath = (t.Definition.Actions.FirstOrDefault() as ExecAction)?.Path;
93+
if (!string.IsNullOrWhiteSpace(execPath))
7294
{
73-
var task = ts.GetTask(taskName);
74-
return task != null && task.State == TaskState.Running;
95+
var exeName = Path.GetFileNameWithoutExtension(execPath);
96+
if (Process.GetProcessesByName(exeName).Any())
97+
return true;
7598
}
99+
100+
return false;
76101
}
77102

78103
public static void StartTask(string taskName)
79104
{
80-
using (TaskService ts = new TaskService())
105+
if (TaskExists(taskName))
81106
{
82-
var task = ts.GetTask(taskName);
83-
task?.Run();
107+
using (TaskService ts = new TaskService())
108+
{
109+
var task = ts.GetTask(taskName);
110+
task?.Run();
111+
}
84112
}
85113
}
86114

87115
public static void StopTask(string taskName)
88116
{
89-
using (TaskService ts = new TaskService())
117+
if (TaskExists(taskName))
90118
{
91-
var task = ts.GetTask(taskName);
92-
task?.Stop();
119+
using (TaskService ts = new TaskService())
120+
{
121+
var task = ts.GetTask(taskName);
122+
task?.Stop();
123+
}
93124
}
94125
}
95126

0 commit comments

Comments
 (0)