- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用以下提供的解决方案:https://stackoverflow.com/a/19104345/2713516要异步运行 WaitForExit,但是,我想使用 Int32 参数重载 ( https://msdn.microsoft.com/en-us/library/ty0d8k56(v=vs.110).aspx ),如 process.WaitForExit(10000)。
如何更改此扩展方法以使其与超时参数一起使用?
附带问题:我还看到有人提到 ( https://stackoverflow.com/a/32994778/2713516 ) 我应该在某个时候处理 cancellationToken,那么我不应该在方法中使用 dispose/using 吗?以及如何?
/// <summary>
/// Waits asynchronously for the process to exit.
/// </summary>
/// <param name="process">The process to wait for cancellation.</param>
/// <param name="cancellationToken">A cancellation token. If invoked, the task will return
/// immediately as canceled.</param>
/// <returns>A Task representing waiting for the process to end.</returns>
public static Task WaitForExitAsync(this Process process,
CancellationToken cancellationToken = default(CancellationToken))
{
var tcs = new TaskCompletionSource<object>();
process.EnableRaisingEvents = true;
process.Exited += (sender, args) => tcs.TrySetResult(null);
if(cancellationToken != default(CancellationToken))
cancellationToken.Register(tcs.SetCanceled);
return tcs.Task;
}
最佳答案
您需要更改方法签名并应用流程本身的结果。例如考虑以下内容:
/// <summary>
/// Waits asynchronously for the process to exit.
/// </summary>
/// <param name="process">The process to wait for cancellation.</param>
/// <param name="cancellationToken">A cancellation token. If invoked, the task will return
/// immediately as canceled.</param>
/// <returns>A Task representing waiting for the process to end.</returns>
public static Task WaitForExitAsync(this Process process,
int milliseconds,
CancellationToken cancellationToken = default(CancellationToken))
{
if (process.HasExited)
{
return Task.CompletedTask;
}
var tcs = new TaskCompletionSource<object>();
process.EnableRaisingEvents = true;
process.Exited += (sender, args) => tcs.TrySetResult(null);
if (cancellationToken != default(CancellationToken))
{
cancellationToken.Register(tcs.SetCanceled);
}
return process.HasExited
? Task.CompletedTask
: Task.WhenAny(tcs.Task, Task.Delay(milliseconds));
}
现在,如果进程还没有结束,任务仍然会在延迟后返回。另一种方法是执行 Task.Run
并调用所需的重载,如下所示:
/// <summary>
/// Waits asynchronously for the process to exit.
/// </summary>
/// <param name="process">The process to wait for cancellation.</param>
/// <param name="cancellationToken">A cancellation token. If invoked, the task will return
/// immediately as canceled.</param>
/// <returns>A Task representing waiting for the process to end.</returns>
public static Task WaitForExitAsync(this Process process,
int milliseconds,
CancellationToken cancellationToken = default(CancellationToken)) =>
process.HasExited
? Task.CompletedTask
: Task.Run(() => process.WaitForExit(milliseconds), cancellationToken);
}
关于c# - process.WaitForExit(int32) 异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36545858/
我正在编写一个应用程序,其中有两个对外部程序的调用,RichCopy 和 7zip。这个想法是使用 RichCopy 移动文件,并在 RichCopy 完成后使用 7zip 存档和加密文件。我遇到的问
我正在调用 ffmpeg。有时调用失败并且 ffmpeg 不会退出它只会进入递归循环。我调用了 WaitForExit 方法。 在代码中,我进一步询问了 standardOutput 和 standa
我在我的应用程序中使用以下语句: System.Diagnostics.Process process = new System.Diagnostics.Process(); process.Star
所以我一直在与这个问题作斗争,并尝试了很多不同的方法来解决它,但都无法解决。 基本上,我的应用所做的就是调用 java 文件以在设备上加载应用。在加载时将其打印到富文本框,然后我想转到下一个文件。我遇
我正在尝试统一运行一个 exe 应用程序以执行某些功能,并且该 exe 文件将在统一运行时从我的麦克风获取输入,所以我必须等到它退出,而使用 waitforexit 可以很好地允许 exe 获取输入但
我正在使用 WMI to start a process on a remote machine .创建进程的调用立即返回,我还获得了远程机器上进程的 ID。 我想等待远程进程完成。一种选择是轮询远程
我下面的代码从while循环中被调用,因此它连续执行多次。有时但并非总是如此,我最终在p.WaitforExit()上遇到线程被中止的错误。有人对此有见识吗?我应该在p.WaitForExit之后调用
我有一个启动进程、等待退出然后返回退出代码的函数: function int login(string pathtofile) { //... Process process = ne
我已经创建了 Print spooler 应用程序来异步打印 pdf。 (应用程序使用veryPDF命令从网络打印机打印) 这是代码 var procStartInfo = new System
我正在将自定义操作添加到我的 VS2008 安装项目(MSI 安装程序)中。 我正在调用一个批处理文件来创建数据库,然后想删除这些文件。我有 WaitForExit() 但它不会等待。为什么?
下面是我启动该过程的代码,只放了演示链接。我希望这个过程在不打开浏览器的情况下在后台运行。第二行也抛出异常 Object reference not set to an instance of an
来自 MSDN 使用新创建进程的 stdoutput 的例子: // This is the code for the base process Process myProcess =
我的程序一直运行良好,但突然卡在 Process.WaitForExit();而不继续执行下一个命令。我已经多次运行该程序而没有出现错误。有谁知道我该如何调试这个或者有谁知道背后的问题是什么?会不会是
此代码在大量机器上按预期运行。然而在一台特定的机器上,调用 WaitForExit()似乎被忽略,实际上将进程标记为已退出。 static void Main(string[] args) {
我有一项服务有时会调用批处理文件。批处理文件需要 5-10 秒来执行: System.Diagnostics.Process proc = new System.Diagnostics.Process
我想等待一个进程完成,但是 Process.WaitForExit() 挂起了我的 GUI。是否有基于事件的方式,或者我是否需要生成一个线程来阻塞直到退出,然后自己委托(delegate)事件? 最佳
我正在尝试执行一个批处理脚本,该脚本在末尾包含一个我想确认的暂停语句: var psi = new ProcessStartInfo(path, arguments); psi.RedirectSta
我正在调用一个“有时”在 VB.NET 中运行的第三部分应用程序(它是一个自托管的 WCF)。但有时第 3 方应用程序会永远挂起,所以我给它添加了一个 90 秒的计时器。问题是,我怎么知道事情是否超时
我正在使用以下提供的解决方案:https://stackoverflow.com/a/19104345/2713516要异步运行 WaitForExit,但是,我想使用 Int32 参数重载 ( ht
我对 c# 和这个论坛总体上还很陌生,但就我而言,我还没有看到任何像我这样的问题可以解决我的问题。 我正在调用方法 Process.WaitForExit() 以等待安装文件完成安装。但是,该方法似乎
我是一名优秀的程序员,十分优秀!