【问题标题】:How to check if a thread is busy in C#?如何检查 C# 中的线程是否忙?
【发布时间】:2012-01-27 22:15:23
【问题描述】:

我有一个在线程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)

我在想:

一)

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

【问题讨论】:

    标签: c# winforms multithreading


    【解决方案1】:

    有一个你可能会关注的事件

    System.Windows.Forms.Application.Idle 
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 那么传入BufferThread 的事件是否会排队等待表单释放?
      • @Sam 是的。 Control.Invoke(和 BeginInvoke)通过将消息添加到 Windows 消息队列来工作。 UI 线程会尽可能(按顺序)处理这些消息,因此它们只会在有机会时排队处理。
      • 明白。但是如果用户关闭表单(它不在主线程上)会发生什么 - 如果我添加:if(form != null) form.Invoke.... 就足够了吗?
      • @Sam 我永远不会为空(因为您保留了参考)。你可以检查 form.Visible,不过...
      • 这种方法很适合调试。我使用调用。但不知什么原因,它开始什么都不做。我的猜测是它被控制线程忙阻塞了。等等等等等等。我需要找出正在发生的事情以及如何解决它。长话短说:问题很好,答案不是!做一些愚蠢的事情有很多(甚至是好的)理由。
      猜你喜欢
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-01
      • 2014-02-18
      相关资源
      最近更新 更多