C# 定时调用同一cmd进程 执行standardinput.writenlineAsync 如果阻塞,则跳过
时间: 2023-07-16 14:16:38 浏览: 198
c# 进程之间的线程同步
你可以使用System.Timers.Timer类来实现定时调用同一cmd进程执行standardinput.writenlineAsync方法。在每个定时器间隔的回调函数中,你可以检查是否存在正在执行的进程,如果存在且当前进程的StandardInput不阻塞,则调用StandardInput.WriteLineAsync方法写入命令。如果StandardInput阻塞,则跳过此次写入,等待下一个定时器回调。以下是示例代码:
```csharp
using System;
using System.Diagnostics;
using System.Timers;
class Program
{
static Process process;
static Timer timer;
static void Main(string[] args)
{
// 启动 cmd 进程
process = new Process();
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.Start();
// 创建定时器,每 1 秒触发一次回调函数
timer = new Timer(1000);
timer.Elapsed += OnTimerElapsed;
timer.Start();
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
// 关闭定时器和进程
timer.Stop();
process.Close();
}
static async void OnTimerElapsed(Object sender, ElapsedEventArgs e)
{
if (process != null && !process.HasExited && !process.StandardInput.BaseStream.CanWrite)
{
Console.WriteLine("StandardInput is blocked, skipping this time.");
return;
}
// 写入命令
await process.StandardInput.WriteLineAsync("echo Hello World!");
}
}
```
注意,由于StandardInput.WriteLineAsync方法是异步的,因此你需要将回调函数声明为async void并使用await关键字来等待方法完成。另外,你需要检查StandardInput.BaseStream.CanWrite属性来判断是否阻塞。
阅读全文