首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WaitforExit不能正常工作

WaitforExit不能正常工作
EN

Stack Overflow用户
提问于 2012-02-09 23:19:50
回答 4查看 16.4K关注 0票数 3

因此,我已经与这个问题斗争了一段时间,并尝试了许多不同的方法来解决它,但都无法解决。

基本上,我的应用程序所做的就是调用一个java文件来将应用程序加载到设备上。在加载时,将其打印到富文本框中,然后我想转到下一个文件。我遇到的问题是,当第一个文件被加载时,第二个文件试图加载哪些情况下会出现问题。我已经尝试了等待退出,但是如果我这样做了,那么输出数据就不会写入富文本框中。有什么想法吗?

代码语言:javascript
复制
private void btnLoad_Click(object sender, EventArgs e)
    {
        rchsdtOut.Clear();
        //count the items in queue.
        var count = lstBarToLoad.Items.Count;

        if (count <= 0)
        {
            MessageBox.Show("Nothing added to the load queue");
       }
        else
       {

            String toLoad;
            for (int i=0; i < count;i++)
              {//START OF FOREACH
                 toLoad = lstBarToLoad.Items[i].Text;
                //call load method.
                  loaddPB(toLoad);      
              }//end of for.
        }//end of else.
    }//end of private

我试着把等待出口放在许多不同的地方,但它似乎不起作用。

代码语言:javascript
复制
     //Method to load files on device.
    private void loaddPB(string toLoad)
    {

        process1 = new System.Diagnostics.Process();
        process1.StartInfo.UseShellExecute = false;
        process1.StartInfo.RedirectStandardOutput = true;
        process1.StartInfo.RedirectStandardError = true;
        process1.StartInfo.CreateNoWindow = true;
        process1.StartInfo.FileName = "java.exe ";

        process1.StartInfo.Arguments = "-Xmx512M -jar";
        process1.StartInfo.Arguments += toLoad;
        try
        {

                 process1.Start();
                 process1.OutputDataReceived += (s, a) => myMethod(a);
                 process1.BeginOutputReadLine();
                 process1.ErrorDataReceived += (s, a) => myErrorMethod(a);
                 process1.BeginErrorReadLine();

                 process1.WaitForExit();
        }
        catch
        {
            Console.WriteLine("error");
        }

    }

下面的两个方法将stdout或error写入富文本字段。

代码语言:javascript
复制
        //Method to do the logging.
    private void myMethod(DataReceivedEventArgs e)
    {

            if (e.Data != null)
            {
                Action action = () => rchsdtOut.Text += "\r\n" + e.Data.ToString();
                rchsdtOut.BeginInvoke(action, null);
                Console.WriteLine(e.Data.ToString());
            }

    }//end of private

    //Method to load the error if any thrown.
    private void myErrorMethod(DataReceivedEventArgs e)
    {
        if (e.Data != null)
        {
            Action action = () => rchsdtOut.Text += "\r\n" + e.Data.ToString();
            rchsdtOut.BeginInvoke(action, null);
            Console.WriteLine(e.Data.ToString());

        }
    }//end of private

任何想法都是很棒的。基本上,我需要进程退出,这样我才能通过forloop继续加载下一个文件。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-09 23:31:10

如果使用WaitForExit,应用程序将阻塞(等待),直到进程退出。这意味着它无法在其UI线程中处理任何Windows消息,因此它不会更新UI。

你需要在后台启动这个过程,这样你的UI才能继续刷新。这可以通过以下方式完成:

  • 从单独的线程启动和监视进程,并将进度信息传递回UI线程,以便显示
  • 将事件处理程序添加到进程退出的事件,或定期轮询process.HasExited标志,并使用此标志了解第一个进程何时完成。您的事件处理程序将启动此进程,然后退出回主应用程序循环,以便在等待外部进程完成时照常运行。
  • 处于忙碌的等待循环中,直到它完成,然后处理应用程序事件。(请注意这一点,因为任何导致对此代码的可重入调用的事件都可能导致非常糟糕的事情。通常,如果你使用这种方法,你需要确保你的应用程序的其余部分被“锁定”在一种它知道它正忙于等待进程完成的状态下)。THis实际上是WaitForExit所做的,但它也处理应用程序事件,允许UI保持模糊的响应性:

while (!process.HasExited) { Application.DoEvents();Thread.Sleep(100);}

票数 6
EN

Stack Overflow用户

发布于 2012-02-09 23:30:47

我可能完全错了,但是...

代码语言:javascript
复制
process1.StartInfo.Arguments = "-Xmx512M -jar";
process1.StartInfo.Arguments += toLoad;

您需要在-jar之后执行have a space

否则Java会立即崩溃。

票数 0
EN

Stack Overflow用户

发布于 2012-02-09 23:37:31

正在尝试将WaitForExit调用移出UI线程。

正如@M. Babcock提到的,您正在阻止对富文本框的更新。

类似这样的解决方案可能会起作用:

修改btnLoad_Click以启动一个处理列表的新线程(位于count >0分支中)

代码语言:javascript
复制
Thread thread = new Thread(new ThreadStart(LoadPbThread));
thread.Start();

然后,添加以下内容:

代码语言:javascript
复制
void LoadPbThread()
{
    String toLoad;
    for (int i=0; i < count;i++)
    {//START OF FOREACH
        toLoad = lstBarToLoad.Items[i].Text;
        //call load method.
        loaddPB(toLoad);      
     }//end of for.
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9213569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档