执行过程后,我的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();
}
答案 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