Sam*_*Sam 5 c# multithreading winforms
我有一个在线程上运行的Windows窗体UI Thread1
.我有另一个线程,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); });
}
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是ThreadBuffer
检查我的表单当前是否正在忙于执行以前的更新.如果是的话,我希望它等到它释放然后再调用它UpdateUI(e)
.
我在考虑:
一个)
//PseudoCode
while(form==busy)
{
// Do nothing;
}
form.Invoke((MethodInvoker)delegate { form.UpdateUI(e); });
Run Code Online (Sandbox Code Playgroud)
我该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]);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我将如何编写一个通知表单是免费的事件?
和
c)其他想法?
我如何检查表格==busy?另外,我不确定这是一个好方法
Control.Invoke
已经有效地做到了这一点。没有理由“等到线程不忙”,因为 Invoke 调用在方法处理之前不会返回,而这种情况只有在线程不忙时才会发生。
你可以直接调用Invoke
而不用担心UI线程是否繁忙。
归档时间: |
|
查看次数: |
2231 次 |
最近记录: |