C#在启动批处理流时冻结

时间:2011-02-18 12:32:31

标签: c# process

嘿,人们!我正在使用名为MineMe的小工具,它用于处理Minecraft服务器。

所以我创建了一个文件流,它应该流式传输start_base.cmd(启动服务器的文件)的输出。出了什么问题,是我窗体的窗口冻结,直到我杀死进程(java.exe - Ran by start_base.cmd)

这是我的代码:

ProcessStartInfo processInfo = new System.Diagnostics.ProcessStartInfo("CMD");

        processInfo.WindowStyle = ProcessWindowStyle.Normal;

        processInfo.RedirectStandardOutput = true;
        processInfo.RedirectStandardInput = true;
        processInfo.RedirectStandardError = true;
        processInfo.CreateNoWindow = true;
        processInfo.UseShellExecute = false;

        Process p = new Process();
        p.StartInfo = processInfo;
        p.Start();

        TextWriter tw = p.StandardInput;


        tw.Flush();
        tw.WriteLine("start_base.cmd");
        tw.Close();

        TextReader tr = p.StandardOutput;
        string output = tr.ReadLine();

        while (output != null)
        {
            this.lg_log.Items.Add(output); // add the output string to a list box
            output = tr.ReadLine();
        }

这里有什么问题? :)请帮帮我..

2 个答案:

答案 0 :(得分:3)

在你的UI线程上启动另一个线程来处理while循环:

Thread t = new Thread(new ThreadStart(DoWork));
t.Start();


public void DoWork()
{
    // work to be done on another thread
}

答案 1 :(得分:2)

问题是你的while循环。您需要在单独的线程(即不是您的UI线程)上执行此操作。

如果您通过单击按钮(或其他一些UI控件)调用上述代码,则应该使用BackgroundWorker线程或线程池中的线程(甚至只是普通的线程)来完成此任务。