У меня есть 1 класс (acBL), который обрабатывает 2 потока (fpDoWork).Любая работа, выполняемая в fpDoWork, инициирует событие обратно в класс acBL.В моей форме я объявляю класс acBL и связываю обработчики событий в acBL - таким образом, всякий раз, когда вызывается событие, оно «должно» обновлять интерфейс с изменениями.
Чего не происходит, когда каждый поток fpDoWork являетсязапускается, выполняет операции, вызывается ProcessingEvent и переходит в событие frmMain.handlerProcessing1.Он достигает точки, где вызывается this.BeginInvoke (новый Processing2Event (handlerProcessing2), status), затем он просто зависает и ждет, пока поток завершит свою работу, прежде чем продолжить обновление пользовательского интерфейса.Я попробовал это. Вызвать, но этот метод просто кажется зависает.Есть идеи?
Код внутри frmMain
Ранее в коде:
this.acBL.Processing1Event += new acBL.Processing1(handlerProcessing1);
this.acBL.Processing2Event += new acBL.Processing2(handlerProcessing2);
Обработчики:
private void handlerProcessing1(string status) {
if (InvokeRequired) {
this.BeginInvoke(new MethodInvoker(this.Refresh));
this.BeginInvoke(new Processing1Event (handlerProcessing1), status);
}
else {
Console.WriteLine("UPDATING 1: "+status);
lblForProcessing1.Text = status;
this.Refresh();
return;
}
}
private void handlerProcessing2(string status) {
if (InvokeRequired) {
this.BeginInvoke(new MethodInvoker(this.Refresh));
this.BeginInvoke(new Processing2Event (handlerProcessing2), status);
}
else {
Console.WriteLine("UPDATING 2: "+status);
lblForProcessing2.Text = status;
this.Refresh();
return;
}
}
Код внутри acBL
В основном методе:
bool thread1Complete = false;
fpDoWork fpDoWork1 = new fpDoWork();
fpDoWork1.GUIForm = frmMain;
fpDoWork1.ProcessingEvent += new fpDoWork.Processing(handlerProcessing1Event);
fpDoWork1.ThreadCompleteEvent += new fpDoWork.ThreadComplete(thread1Complete);
Thread fpDoWork1Thread= new Thread(new ThreadStart(fpDoWork1.StartWork));
bool thread2Complete = false;
fpDoWork fpDoWork2 = new fpDoWork();
fpDoWork2.GUIForm = frmMain;
fpDoWork2.ProcessingEvent += new fpDoWork.Processing(handlerProcessing2Event);
fpDoWork2.ThreadCompleteEvent += new fpDoWork.ThreadComplete(thread2Complete);
Thread fpDoWork2Thread= new Thread(new ThreadStart(fpDoWork2.StartWork));
Console.WriteLine("Work for 1 Thread started...");
fpDoWork1Thread.Start();
Console.WriteLine("Work for 2 Thread started...");
fpDoWork2Thread.Start();
while (!thread1Complete && !thread2Complete ) {
if (!thread1Complete && !thread2Complete ) {
Console.WriteLine("Waiting for both copying threads...");
}
else if (!thread1Complete && thread2Complete ) {
Console.WriteLine("Waiting for thread 1...");
}
else if (thread1Complete && !thread2Complete ) {
Console.WriteLine("Waiting for thread 2...");
}
Thread.Sleep(1000);
}
Console.WriteLine("All done");
Иное где в коде:
public delegate void ProcessingFor1 (string filename);
public delegate void ProcessingFor2 (string filename);
public event ProcessingFor1 ProcessingEventFor1;
public event ProcessingFor2 ProcessingEventFor2;
private void handlerProcessing1Event(string filename) {
Console.WriteLine("Processing 1: " + filename);
ProcessingEventFor1(filename);
}
private void handlerProcessing1Event(string filename) {
Console.WriteLine("Processing 2: " + filename);
ProcessingEventFor2(filename);
}