Skip to content

Commit 2d3e9de

Browse files
author
Martin Lercher
committed
BugFix - ProcessScheduler tests green
1 parent 8db00e6 commit 2d3e9de

File tree

2 files changed

+21
-10
lines changed

2 files changed

+21
-10
lines changed

src/JsonRpc/ProcessScheduler.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public void Add(RequestProcessType type, Func<Task> request)
3232
private Task Start(Func<Task> request)
3333
{
3434
var t = request();
35-
if (t.Status == TaskStatus.WaitingToRun)
35+
if (t.Status == TaskStatus.Created) // || t.Status = TaskStatus.WaitingForActivation ?
3636
t.Start();
3737
return t;
3838
}
@@ -70,12 +70,21 @@ private void ProcessRequestQueue()
7070
{
7171
if (ex.CancellationToken != token)
7272
throw;
73-
// else ignore. OperationCanceledException - The CancellationToken has been canceled.
73+
// OperationCanceledException - The CancellationToken has been canceled.
74+
Task.WaitAll(waitables.ToArray(), TimeSpan.FromMilliseconds(1000));
75+
waitables.ForEach((t) =>
76+
{
77+
if (!t.IsCompleted) {
78+
// TODO: There is no way to abort a Task. As we don't construct the tasks, we can do nothing here
79+
// Option is: change the task factory "Func<Task> request" to a "Func<CancellationToken, Task> request"
80+
}
81+
});
7482
}
7583
}
7684

7785
public void Dispose()
7886
{
87+
if (_queueThread == null) return;
7988
_queueThread = null;
8089
_cancel.Cancel();
8190
_cancel.Dispose();

test/JsonRpc.Tests/ProcessSchedulerTests.cs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,13 @@ public void ShouldScheduleCompletedTask(RequestProcessType type)
2727
{
2828
using (IScheduler s = new ProcessScheduler())
2929
{
30-
var done = false;
30+
var done = new CountdownEvent(1);
3131
s.Start();
3232
s.Add(type, () => {
33-
done = true;
33+
done.Signal();
3434
return Task.CompletedTask;
3535
});
36-
Thread.Sleep(SLEEPTIME_MS);
37-
done.Should().Be(true);
36+
done.Wait(ALONGTIME_MS).Should().Be(true);
3837
}
3938
}
4039

@@ -58,11 +57,14 @@ public void ShouldScheduleConstructedTask(RequestProcessType type)
5857
{
5958
using (IScheduler s = new ProcessScheduler())
6059
{
61-
var done = false;
60+
var done = new CountdownEvent(1);
6261
s.Start();
63-
s.Add(RequestProcessType.Serial, () => new Task(() => done = true));
64-
Thread.Sleep(SLEEPTIME_MS);
65-
done.Should().Be(true);
62+
s.Add(RequestProcessType.Serial, () => {
63+
return new Task(() => {
64+
done.Signal();
65+
});
66+
});
67+
done.Wait(ALONGTIME_MS).Should().Be(true);
6668
}
6769
}
6870

0 commit comments

Comments
 (0)