How do I implement cancellation when running a cmd-file correctly? Currently I use this code:
public async IAsyncEnumerable<string?> ExecuteCmdFile(string parameters, [EnumeratorCancellation] CancellationToken cancellationToken = default)
{
var startInfo =
new ProcessStartInfo(_cmdFilePath, parameters) { RedirectStandardOutput = true, CreateNoWindow = true };
using var p = new Process { StartInfo = startInfo };
p.Start();
while (!p.HasExited)
{
if (cancellationToken.IsCancellationRequested)
{
p.Kill();
yield return "Operation aborted";
}
else
{
yield return await p.StandardOutput.ReadLineAsync().ConfigureAwait(false);
}
}
}
Cancellation generally works but - depending on the task currently running - it may take a while, because the process first has to wait for ReadLineAsync()
to return a value
before cancellationToken.IsCancellationRequested()
is checked again and can be acted upon.
Any ideas on how to solve this?