我发现了一个可以在不冻结用户界面的情况下执行某些操作的代码。这段代码将在“开始工作”按钮被按下时执行。我认为用户会通过“停止”按钮停止此工作。所以我在MSDN上找到了这篇文章:https://msdn.microsoft.com/en-us/library/jj155759.aspx。但是,在这段代码中应用CancellationToken
很难。有人能帮忙解决这个问题吗?
我只使用public static async Task<int> RunProcessAsync(string fileName, string args)
方法。
代码(来自https://dev59.com/WWgv5IYBdhLWcg3wMN0U#31492250):
public static async Task<int> RunProcessAsync(string fileName, string args)
{
using (var process = new Process
{
StartInfo =
{
FileName = fileName, Arguments = args,
UseShellExecute = false, CreateNoWindow = true,
RedirectStandardOutput = true, RedirectStandardError = true
},
EnableRaisingEvents = true
})
{
return await RunProcessAsync(process).ConfigureAwait(false);
}
}
// This method is used only for internal function call.
private static Task<int> RunProcessAsync(Process process)
{
var tcs = new TaskCompletionSource<int>();
process.Exited += (s, ea) => tcs.SetResult(process.ExitCode);
process.OutputDataReceived += (s, ea) => Console.WriteLine(ea.Data);
process.ErrorDataReceived += (s, ea) => Console.WriteLine("ERR: " + ea.Data);
bool started = process.Start();
if (!started)
{
//you may allow for the process to be re-used (started = false)
//but I'm not sure about the guarantees of the Exited event in such a case
throw new InvalidOperationException("Could not start process: " + process);
}
process.BeginOutputReadLine();
process.BeginErrorReadLine();
return tcs.Task;
}
使用方法:
var cancelToken = new CancellationTokenSource();
int returnCode = async RunProcessAsync("python.exe", "foo.py", cancelToken.Token);
if (cancelToken.IsCancellationRequested) { /* something */ }
当点击启动按钮时,它会启动一些Python脚本。 当脚本正在运行并且用户想要停止它时,用户按下停止按钮。 然后程序执行以下代码。
cancelToken.Cancel();
非常感谢您阅读这个问题。
CancellationToken
做什么?终止进程吗? - Stephen ClearyCancellationToken
!更别提任何问题陈述了,除了可能是“很难”。请提供一个可靠地重现你遇到的任何问题的好的 [mcve]。同时,请提供一个精确的问题描述:解释一下代码现在的作用以及你想要它代替的内容。 - Peter Duniho