Skip to content

Commit 074a06a

Browse files
committed
fixed cancellation support
1 parent 05099b7 commit 074a06a

File tree

2 files changed

+31
-5
lines changed

2 files changed

+31
-5
lines changed

src/LineCount.cs

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using LineCount.Errors;
55
using LineCount.Logging;
66
using LineCount.Result;
7+
using System.Threading.Tasks;
78

89
namespace LineCount;
910

@@ -129,6 +130,11 @@ static async Task<ReportResult> CountInDirectories(string path, LineCountData da
129130

130131
await foreach (var result in Task.WhenEach(directorytasks))
131132
{
133+
if (!result.IsCompletedSuccessfully)
134+
{
135+
return HandleTaskFailure(result);
136+
}
137+
132138
if (!result.Result.TryGetValue(out LineCountReport? report))
133139
{
134140
return ReportResult.Failure(result.Result.Error);
@@ -144,11 +150,26 @@ static async Task<ReportResult> CountInDirectories(string path, LineCountData da
144150
return new LineCountReport(lineCount, fileCount);
145151
}
146152

153+
static ReportResult HandleTaskFailure<T>(Task<T> result)
154+
{
155+
if (result.IsCanceled)
156+
{
157+
throw new OperationCanceledException();
158+
}
159+
160+
if (result.IsFaulted)
161+
{
162+
return new UndiagnosedError(result.Exception);
163+
}
164+
165+
return new InternalError("Task has not been cancelled or faulted nor completed successfully");
166+
}
167+
147168
static async Task<ReportResult> CountInFiles(string path, LineCountData data, PathPatterns excludeFilePatterns, CancellationToken cancellationToken = default)
148169
{
149170
List<Task<Result<FileStats, IError>>> filetasks = [];
150-
151171
try
172+
152173
{
153174
IEnumerable<string> files = GetFilterFilePaths(path, data);
154175

@@ -160,7 +181,7 @@ static async Task<ReportResult> CountInFiles(string path, LineCountData data, Pa
160181
}
161182

162183
Task<Result<FileStats, IError>> task = GetSingleFileLineCount(file, data, cancellationToken)
163-
.ContinueWith(task => task.Result.Map(report => new FileStats(file, report.Lines)));
184+
.ContinueWith(task => task.Result.Map(report => new FileStats(file, report.Lines)), cancellationToken, TaskContinuationOptions.NotOnCanceled, TaskScheduler.Current);
164185
filetasks.Add(task);
165186
}
166187
}
@@ -194,7 +215,12 @@ static async Task<ReportResult> CountInFiles(string path, LineCountData data, Pa
194215

195216
await foreach (var result in Task.WhenEach(filetasks))
196217
{
197-
if(!result.Result.TryGetValue(out FileStats? fileStats))
218+
if (!result.IsCompletedSuccessfully)
219+
{
220+
return HandleTaskFailure(result);
221+
}
222+
223+
if (!result.Result.TryGetValue(out FileStats? fileStats))
198224
{
199225
return ReportResult.Failure(result.Result.Error);
200226
}
@@ -233,7 +259,7 @@ static Task<LineCountReport> GetSingleFileLineCountReport(string path, LineCount
233259
FilterType.FilteredExcept => GetFilteredFileLineCount(path, line => !data.ExcludeLineFilter!.IsMatch(line), cancellationToken),
234260
FilterType.FilteredBoth => GetFilteredFileLineCount(path, line => data.LineFilter!.IsMatch(line) && !data.ExcludeLineFilter!.IsMatch(line), cancellationToken),
235261
_ => throw new InvalidOperationException($"CountType.{data.FilterType} not recognized"),
236-
}).ContinueWith(task => new LineCountReport(task.Result));
262+
}).ContinueWith(task => new LineCountReport(task.Result), cancellationToken, TaskContinuationOptions.NotOnCanceled, TaskScheduler.Current);
237263
}
238264

239265
static async Task<ReportResult> GetSingleFileLineCount(string path, LineCountData data, CancellationToken cancellationToken = default)

src/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
ListFiles = listFiles
5555
};
5656

57-
var result = await LineCount.LineCount.Run(path, data, excludeDirectories ?? [], excludeFiles ?? []);
57+
var result = await LineCount.LineCount.Run(path, data, excludeDirectories ?? [], excludeFiles ?? [], context.GetCancellationToken());
5858

5959
if(listFiles)
6060
{

0 commit comments

Comments
 (0)