我在一个帖子Thread1
上运行了一个Windows窗体UI。我有另一个线程Thread2
,它通过需要更新Windows UI的外部事件获取大量数据。 (它实际上更新了多个UI线程。)
我有第三个线程Thread3
,我将其用作Thread1
和Thread2
之间的缓冲线程,以便Thread2
可以继续更新其他线程(通过同样的方法)。
我的缓冲线程Thread3
,如下所示:
public class ThreadBuffer
{
public ThreadBuffer(frmUI form, CustomArgs e)
{
form.Invoke((MethodInvoker)delegate { form.UpdateUI(e); });
}
}
我想要做的是ThreadBuffer
检查我的表单当前是否正忙于执行以前的更新。如果是,我希望它等到它释放然后再调用UpdateUI(e)
。
我在考虑:
A)
//PseudoCode
while(form==busy)
{
// Do nothing;
}
form.Invoke((MethodInvoker)delegate { form.UpdateUI(e); });
我如何查看form==busy
?另外,我不确定这是一个好方法。
b)在form1中创建一个事件,通知ThreadBuffer
它已准备好处理。
// psuedocode
List<CustomArgs> elist = new List<CustomArgs>();
public ThreadBuffer(frmUI form, CustomArgs e)
{
from.OnFreedUp += from_OnFreedUp();
elist.Add(e);
}
private form_OnFreedUp()
{
if (elist.count == 0)
return;
form.Invoke((MethodInvoker)delegate { form.UpdateUI(elist[0]); });
elist.Remove(elist[0]);
}
在这种情况下,我如何编写一个会通知表单是免费的事件?
和
c)其他想法?答案 0 :(得分:2)
我如何检查表格==忙?另外,我不确定这是一个好方法
Control.Invoke
已经有效地做到了这一点。没有理由“等到线程不忙”,因为Invoke调用在方法处理之前不会返回,直到线程不忙才会发生。
您可以调用Invoke
,而不必担心UI线程是否正忙。
答案 1 :(得分:2)
您可能会看到一个事件
System.Windows.Forms.Application.Idle