在我的代码中,我使用Process对象来执行一系列DOS批处理文件。 例如,我缩短了脚本列表。可以调用执行引发异常的主UI线程代码吗?
后续(1+)脚本通过事件处理程序(而不是for循环)执行。这样,每个后续脚本只有在前一个脚本完成时才运行。现在由于某种原因,当我执行第二个脚本时,我无法获取捕获到的异常,以便用错误消息填充状态栏。
我正在测试什么时候在应用程序配置文件中输入了无效的脚本名称,而我嫌疑人我错误地使用了委托。我的匿名委托包含“新代码”和现有类方法的组合。那是什么我认为是错的;如果你们都能推我朝着为什么我会感激;)
注:this.copy_scripts []是从拆分constructued: “goodname.bat,nosuchscript.bat”
private void copybutton_Click(object sender, EventArgs e)
{
InitializeBar();
this.nbr_of_copy_exits_ = 0;
this.RunCopyScript(this.nbr_of_copy_exits_);
return;
}
private void RunCopyScript(Int32 CopyScriptIdx)
{
Process proc = null;
try
{
proc = this.ObtainProcess(this.client_dest_dir_ + this.copy_scripts_[CopyScriptIdx]);
proc.EnableRaisingEvents = true;
proc.Exited += new EventHandler(CopyExited);
proc.Start();
this.progressBar.Value = ProgressInPercent(this.copy_scripts_.Count(), CopyScriptIdx);
}
catch (Exception ex)
{
this.UpdateControl(this.toolStripStatusLabel1, "Error involving " + this.copy_scripts_[CopyScriptIdx] + ": " + ex.Message);
this.copybutton.BackColor = Color.Red;
}
return;
}
void CopyExited(object sender, EventArgs e)
{
System.Diagnostics.Process senderProcess
= sender as System.Diagnostics.Process;
this.Invoke((MethodInvoker)delegate
{
if (++this.nbr_of_copy_exits_ == this.copy_scripts_.Count())
{
this.UpdateControl(this.toolStripStatusLabel1, "Copying COMPLETE.");
this.progressBar.Value = 0;
}
else
{
this.RunCopyScript(this.nbr_of_copy_exits_);
}
});
}
private void UpdateControl(ToolStripStatusLabel tssl, String text)
{
tssl.Text = text;
tssl.Refresh();
}
很好,谢谢你的工作。我尝试了你的方法,不幸的是得到了相同的结果。但是你的方法使用了我还没有的东西:Begin/EndInvoke,委托定义,IAsync等,我很快就会使用它们。谢谢。 – Joe 2010-02-17 00:40:13
@Joe:我不确定我能接近多远来帮助你,但我认为这可能值得努力尝试。 – IAbstract 2010-02-17 02:06:25
绝对是。我会交换一个仍然没有解决的小问题(即:应用程序配置文件不可能被更改为开始,更不用说其中有无效条目),以便随时采用新的方式。这是我绝对会使用的很好的信息。我们'自嘲'需要坚持到一起。这并不容易,有它;) – Joe 2010-02-17 21:35:23