dotnet core 2过程从超时开始



我有一种方法可以从dotnet core 2中的C#代码启动过程。此方法如下:

    internal static string[] RunCommand(string filename, string args, string workingDirectory = null)
    {
        var proc = new Process
        {
            StartInfo = new ProcessStartInfo
            {
                FileName = filename,
                Arguments = args,
                UseShellExecute = false,
                RedirectStandardOutput = true,
                //WindowStyle = ProcessWindowStyle.Hidden
            }
        };
        if (workingDirectory != null)
        {
            proc.StartInfo.WorkingDirectory = workingDirectory;
        }
        //Console.WriteLine(proc.StartInfo.FileName + " " + proc.StartInfo.Arguments);
        List<string> lines = new List<string>();
        proc.Start();
        while (!proc.StandardOutput.EndOfStream)
        {
            string line = proc.StandardOutput.ReadLine();
            if (!string.IsNullOrEmpty(line))
            {
                lines.Add(line);
            }
        }
        proc.Dispose();
        return lines.ToArray();
    }

问题是,某些启动过程陷入了循环,这使我的VPS陷入了问题。

所以问题是有任何解决方案可以运行截止日期的过程?

更新

根据" jacek blaszczynski"的建议,我尝试了代码:

    internal static string[] RunCommand(string filename, string args, string workingDirectory = null, int timeoutInSeconds = 60)
    {
        var proc = new Process
        {
            StartInfo = new ProcessStartInfo
            {
                FileName = filename,
                Arguments = args,
                UseShellExecute = false,
                RedirectStandardOutput = true,
                //WindowStyle = ProcessWindowStyle.Hidden
            }
        };
        if (workingDirectory != null)
        {
            proc.StartInfo.WorkingDirectory = workingDirectory;
        }
        //Console.WriteLine(proc.StartInfo.FileName + " " + proc.StartInfo.Arguments);
        List<string> lines = new List<string>();
        bool isKilled = false;
        new Thread(() =>
        {
            Thread.CurrentThread.IsBackground = true;
            Thread.Sleep(timeoutInSeconds * 1000);
            try
            {
                if (proc != null && !proc.HasExited)
                {
                    isKilled = true;
                    proc.Kill();
                    Console.WriteLine("Annoying process killed.");
                }
            }
            catch
            {
                // just let it go
            }
        }).Start();
        try
        {
            proc.Start();
            while (!proc.StandardOutput.EndOfStream)
            {
                string line = proc.StandardOutput.ReadLine();
                if (!string.IsNullOrEmpty(line))
                {
                    lines.Add(line);
                }
            }
            proc.Dispose();
        }
        catch
        {
            // just look what happens
        }
        return isKilled ? new string[] { "" } : lines.ToArray();
    }

,但我仍然有一些流浪过程。由于多线程过程的调试非常困难,导致这种情况的情况对我来说是未知的,您是否知道为什么某个过程应该现场直播我的陷阱?

首先,我需要对缺少信息做一些假设:(i)您在Windows上运行代码,(ii)您的过程没有图形用户界面(窗口)。有两种推荐的方法可以停止Windows进程,其中首选选择取决于过程类型:(i)GUI过程,(ii)非GUI过程。在第二种情况下,您应该调用Process.Kill()方法以立即退出可靠的流程,然后再进行Process.WaitForExit()。Microsoft文档指出:

杀戮是终止没有图形接口的过程的唯一方法。

它不会减轻您清理流程资源(DisposeClose调用),但是,此任务在某种程度上是Process.Kill()的正交,根据文档可能会导致:

通过分配给该过程的流程或资源编辑的数据,如果您致电Kill,则可能会丢失。

可能会抛出很多不同的例外,因此保证了除了基本异常处理代码之外。

相关内容

  • 没有找到相关文章

最新更新