在我得到的想法中陷入困境

时间:2013-02-17 23:28:42

标签: c#

首先,抱歉我无法给出正确的头衔。 在搜索,搜索和搜索之后几乎整整一天,我都遇到了一个想法,直到我决定在Stackoverflow上问它!

所以这就是我陷入困境的地方:

(我正在制作一个目前用C#编码的自动安装程序,它是荷兰语。它真的很棒但是我只需要一件事来完成我的基础。例如:

  • 您在核对清单框中选择了“多个”对象,这些对象是从核对表列表中读取的,它们会被修剪掉,之后就会启动它们。

现在一切正常,我想添加一个等待方法,例如我们得到了:

  • Malwarebytes& CCleaner作为安装'示例'。

现在当两者都被选中时,我点击开始,它会启动这两个程序。 我想要做的是:告诉程序启动一个程序,做你的事情,一旦完成(关闭)它应该转到下一个。

但是......有一个问题,我的程序是在数组中启动的,所以如果检查了多个对象,它基本上可以工作,而不是启动所有已检查的对象。我真的不知道如何达到基本相同的目的:

  • 如果选择了多个对象,启动对象,做你的事(自动点击等),一旦关闭并确认其关闭,继续下一个对象并做同样的事情,直到它被完成。我想让它与进度条一起使用,但从未真正查看进度条,因为它们似乎令人困惑。

我有一段代码可以找到进程ID,所以也许我可以用它做些什么,但是我开始的应用程序上的进程ID永远不会相同,所以当它们从一个数组开始时,我得到了一些问题。

有人可以帮我解决一下&如何编码/执行此操作?

这是我用来完成这项工作的代码:

                string pad = Application.StartupPath;

            foreach (string checkedItem in checkedListBox1.CheckedItems)
            {
                if (checkedItem.Contains("."))
                {
                    string str = checkedItem;
                    if (str.Contains("."))
                    {
                        int index = str.IndexOf('.');
                        string folder = str.Substring(0, index);
                        try
                        {
                            bool started = false;
                            var process = new Process();
                            process.StartInfo.FileName = pad + "/data/" + folder + "/" + checkedItem;
                            started = process.Start();
                            var processID = process.Id;
                            var processNAAM = process.ProcessName;
                            textBox1.Text += "Gevonden - ID: " + processID + "     NAAM: " + processNAAM + Environment.NewLine;
                            textBox1.Text += DateTime.Now.ToString("HH:mm:ss", System.Globalization.DateTimeFormatInfo.InvariantInfo) + "  -  " + "Installatie Keuze wordt opgestart." + Environment.NewLine;
                            process.WaitForExit();

                        }
                        catch (Exception)
                        {
                        }
                    }
                }
            }

2 个答案:

答案 0 :(得分:1)

首先,您可以使用CheckedListBox的CheckedItems属性使代码更简单,更短。其次,没有必要将所有字符串从一个字符串复制到另一个字符串。字符串在.NET中是不可变的 - 它们永远不会改变。你可以只保留一份副本并从那里剪切。

接下来,您可以使用System.IO.Path中的方法来剪切没有扩展名的文件名,或者构建完整路径而不必担心“/”太多或太少。

第三,对于您的原始问题 - 只需在WaitForExit对象上调用Process以使其等待,然后再继续处理进程列表。

第三

foreach (string checkedItem in checkedListBox1.CheckedItems)
{
   if (checkedItem.Contains("."))
   {
       string baseName = Path.GetFileNameWithoutExtension(checkedItem);
       string processPath = Path.Combine(pad, "data", baseName, checkedItem); 
       Process process = Process.Start(processPath);
       process.WaitForExit();
   }
}

答案 1 :(得分:0)

在您开始流程的行(process.Start())之后,只需添加以下内容:

process.WaitForExit()

这将暂停包含的线程,直到目标进程退出。