如何解决使用BeginInvoke进行UI更新挂起,直到线程完成?
| 我有1个类(acBL),可处理2个线程(fpDoWork)。在fpDoWork中完成的任何工作都会触发一个事件回到acBL类。在我的表单上,我声明了acBL类并在acBL上关联了事件处理程序-这样,无论何时调用事件,它都“应该”使用更改来更新UI。 没有发生什么事,当每个fpDoWork线程启动时,它执行操作,然后调用ProcessingEvent并进入frmMain.handlerProcessing1事件。到达要点,调用this.BeginInvoke(new Processing2Event(handlerProcessing2),status),然后它挂起并等待线程完成工作,然后继续更新UI。我尝试了这个。调用,但是该方法似乎挂起了。有任何想法吗? 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);
}
解决方法
您的用户界面未更新的原因是主用户界面线程卡在了while()循环中。 BackgroundWorker是你的朋友
尝试避免在一个线程中创建线程并坐在那里等待它们完成,这首先是对线程的错误使用
干杯
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。