如何检查线程是否在C#中忙?

时间:2012-01-27 22:15:23

标签: c# winforms multithreading

我在一个帖子Thread1上运行了一个Windows窗体UI。我有另一个线程Thread2,它通过需要更新Windows UI的外部事件获取大量数据。 (它实际上更新了多个UI线程。)

我有第三个线程Thread3,我将其用作Thread1Thread2之间的缓冲线程,以便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)其他想法?

2 个答案:

答案 0 :(得分:2)

  

我如何检查表格==忙?另外,我不确定这是一个好方法

Control.Invoke已经有效地做到了这一点。没有理由“等到线程不忙”,因为Invoke调用在方法处理之前不会返回,直到线程不忙才会发生。

您可以调用Invoke,而不必担心UI线程是否正忙。

答案 1 :(得分:2)

您可能会看到一个事件

System.Windows.Forms.Application.Idle