我有一个dataGridView,在其中为每个条目运行一个进程,然后根据进程的输出更新toolStripProgressBar。
我查看了以下线程, 在.NET 4.5中并行运行两个异步任务并收集结果 并行循环调用中的进度条 如何从同时运行的任务更新进度条 但我不知道如何将我的当前代码更改为类似这些线程的代码。 我认为,与这些线程的主要区别在于,我的计算是由外部应用程序完成的,然后我需要收集输出。 我想我必须将每个进程定义为一个异步任务,然后以某种方式收集输出。
为简单起见,在示例代码中,处理过程具有相等的权重。
我该如何并行运行进程并根据从.exe应用程序获得的1到100的输出数字更新进度条?欢迎任何建议或建议。
我查看了以下线程, 在.NET 4.5中并行运行两个异步任务并收集结果 并行循环调用中的进度条 如何从同时运行的任务更新进度条 但我不知道如何将我的当前代码更改为类似这些线程的代码。 我认为,与这些线程的主要区别在于,我的计算是由外部应用程序完成的,然后我需要收集输出。 我想我必须将每个进程定义为一个异步任务,然后以某种方式收集输出。
为简单起见,在示例代码中,处理过程具有相等的权重。
private iNumProcesses;
private void RunApps()
{
iNumProcesses = dataGridView1.Rows.Count;
string sPath = .exe application path
for (int i = 0; i < iNumProcesses; i++)
{
string sArgs = dataGridView1.Rows[i]["Arguments"].ToString();
ExecuteProgram(sPath, sArgs);
}
}
private void ExecuteProgram(string sProcessName, string sArgs)
{
using (cmd = new Process())
{
cmd.StartInfo.FileName = sProcessName;
cmd.StartInfo.Arguments = sArgs;
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.CreateNoWindow = true;
cmd.StartInfo.ErrorDialog = true;
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.RedirectStandardError = true;
cmd.OutputDataReceived += new DataReceivedEventHandler(SortOutputHandler);
cmd.ErrorDataReceived += new DataReceivedEventHandler(SortOutputHandler);
cmd.Start();
cmd.BeginOutputReadLine();
while (!cmd.HasExited) { Application.DoEvents(); }
}
}
private void SortOutputHandler(object sender, DataReceivedEventArgs e)
{
Trace.WriteLine(e.Data);
this.BeginInvoke(new MethodInvoker(() =>
{
if (e.Data == "Start") { do something... }
else if (e.Data == "Finish") { do something... }
else if (e.Data == "End") { do something... }
else
{
// .exe application output numbers 1 through 100
toolStripProgressBar1.Value += Math.Round(Convert.ToInt32(e.Data)/iNumProcesses,0);
}
}));
}
我该如何并行运行进程并根据从.exe应用程序获得的1到100的输出数字更新进度条?欢迎任何建议或建议。