@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);
これは、次の2つのメソッドを呼び出します。
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;
}
}
次に、同様のパターンを使用してリッチテキストボックスを更新できます。