正如@Thinhbk 所说,Form1
每次您想要更新工具条时都创建一个新的不是要走的路。您遇到的另一个问题是所有处理都在同一个线程中运行(我查看了您在 Pastebin 上发布的内容),这意味着您无论如何都不会看到进度更新。
为了使它工作,我首先将public void AX1Program(string path)
方法的签名修改为:
public void AX1Program(Form1 form1, ManualResetEvent resetEvent, string path)
传入表单意味着我们可以访问该UpdateStatusBar
方法,并resetEvent
用于在线程完成时发出信号。AX1Program
对此的更改主体:
try
{
...
//Do work as per normal
...
form1.UpdateStatusBar("some new status");
}
catch (Exception)
{
//Any exception handling/logging you may need.
}
finally
{
//Indicate that we are done.
resetEvent.Set();
}
现在,要调用该AX1Program
方法,您目前有一些代码(它在您的Writebutton_Click
方法中的几个地方):
Program Pgm1 = new Program();
Pgm1.AX1Program(CSVtextBox.Text);
我们想异步调用它,所以我们改为:
RunAX1Program(CSVtextBox.Text);
它调用以下两种方法:
private void RunAX1Program(string text)
{
ManualResetEvent resetEvent = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(RunAX1ProgramDelegate,
new object[] { resetEvent, text });
}
private void RunAX1ProgramDelegate(object state)
{
object[] stateArray = (object[])state;
ManualResetEvent resetEvent = (ManualResetEvent)stateArray[0];
string text = (string)stateArray[1];
Program program = new Program();
program.AX1Program(this, resetEvent, text);
//Wait until the event is signalled from AX1Program.
resetEvent.WaitOne();
}
因为我们现在想从另一个线程更新工具条,所以该UpdateStatusBar
方法需要如下所示,以便我们可以安全地修改控件:
public void UpdateStatusBar(string status)
{
if (this.InvokeRequired)
{
this.BeginInvoke((MethodInvoker)delegate
{
UpdateStatusBar(status);
});
}
else
{
toolStripStatusLabel1.Text = status;
}
}
然后,您可以使用类似的模式来更新您的富文本框。