PictureBox在执行过程时冻结

时间:2018-11-28 13:59:53

标签: c# picturebox freeze

执行过程后,我的PictureBox出现问题。在我调用仅执行一个批处理文件的过程时,PictureBox(显示GIF动画)冻结了。

我想单击启动该过程的按钮,并显示显示GIF动画的PictureBox,并且在完成该过程之后,我想隐藏PictureBox。

有人知道如何实现这一目标吗?

这是我的代码:

// My executeCmdCommand
public void executeCmdCommand(string argument)
{
    var arg0 = argument; // Path

    System.Diagnostics.Process process = new System.Diagnostics.Process();
    System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
    startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    startInfo.FileName = "cmd.exe";
    startInfo.Arguments = "/C " + arg0;
    process.StartInfo = startInfo;

    process.Start();
    process.WaitForExit();
}

private void button1_Click(object sender, EventArgs e)
{
    DisplayImage();
    string cmdCom = @"C:\Users\Mim\Desktop\test.bat";
    executeCmdCommand(cmdCom);
    HideImage();
}

private void DisplayImage()
{
    imageControl.Show();
    //PictureBox imageControl = new PictureBox();
    imageControl.Width = 400;
    imageControl.Height = 400;
    Bitmap image = new Bitmap(@"C:\Users\foobar\Desktop\loading.gif");
    imageControl.Dock = DockStyle.Fill;
    imageControl.Image = (Image)image;
    Controls.Add(imageControl);
}

private void HideImage()
{
    imageControl.Hide();
}

1 个答案:

答案 0 :(得分:2)

问题出在您的executeCmdCommand()函数中的以下代码行上:

process.WaitForExit();

看看文档中关于此方法的内容:

  

Process.WaitForExit Method | Microsoft Docs

     

设置等待关联进程退出的时间,并阻止当前执行线程,直到该时间过去或进程退出为止。为避免阻塞当前线程,请使用Exited事件。

因此,如果您希望UI线程在外部过程执行结束之前不受阻塞,则不应调用此方法。但是,如果您仍然希望在过程结束时得到警告,则可以按照文档中的建议使用Exited事件。

您可以在此处找到使用Exited事件的示例以及其他想法:

  

Windows Form run external process without blocking UI - Stack Overflow

我只会在我刚刚链接的答案中添加一件事:如果要在Process.Exited事件调用的事件处理程序中隐藏PictureBox,则应设置{{ 1}}到Form属性(documentation)上,否则您的事件处理程序可能(大部分可能)在与UI线程不同的线程上执行,从而在从{{1 }},包括控件。

代码可能像这样:

Process.SynchronizingObject