РЕДАКТИРОВАТЬ : Это может не решить проблему, но вы можете обработать событие ProgressChanged
BackgroundWorkers и установить текст там.
Например:
void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) {
SetText((string)e.UserState);
} //Make this method handle the RunWorkerCompleted for both workers
//In DoWork:
worker.ReportProgress(0, sText);
ProgressChanged запускается в потоке пользовательского интерфейса, поэтому вам не нужно вызывать Invoke
.
Кстати, вам, вероятно, следует переименовать SetText
в AppendText
, чтобы сделать код более понятным.
Кроме того, вы можете использовать встроенный делегат Action<String>
вместо создания собственного типа делегата SetTextCallback
.
РЕДАКТИРОВАНИЕ : Кроме того, вам, вероятно, следует переместить чек InvokeRequired
в SetText
.
Например:
private void AppendText(string text) {
if(textBox1.InvokeRequired) {
textBox1.Invoke(new Action<string>(AppendText), text);
return;
}
this.textBox1.AppendText(text);
this.textBox1.SelectionStart = textBox1.TextLength;
this.textBox1.ScrollToCaret();
}