首先,抱歉我无法给出正确的头衔。 在搜索,搜索和搜索之后几乎整整一天,我都遇到了一个想法,直到我决定在Stackoverflow上问它!
所以这就是我陷入困境的地方:
(我正在制作一个目前用C#编码的自动安装程序,它是荷兰语。它真的很棒但是我只需要一件事来完成我的基础。例如:
现在一切正常,我想添加一个等待方法,例如我们得到了:
现在当两者都被选中时,我点击开始,它会启动这两个程序。 我想要做的是:告诉程序启动一个程序,做你的事情,一旦完成(关闭)它应该转到下一个。
但是......有一个问题,我的程序是在数组中启动的,所以如果检查了多个对象,它基本上可以工作,而不是启动所有已检查的对象。我真的不知道如何达到基本相同的目的:
我有一段代码可以找到进程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)
{
}
}
}
}
答案 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()
这将暂停包含的线程,直到目标进程退出。