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

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)其他想法?

Ree*_*sey 2

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

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

你可以直接调用Invoke而不用担心UI线程是否繁忙。

  • @萨姆是的。Control.Invoke(和BeginInvoke)通过将消息添加到Windows消息队列来工作。UI 线程尽可能(按顺序)处理这些消息,因此它们只会排队并在有机会时进行处理。 (2认同)