【问题标题】:Is InvokeRequired required? [duplicate]是否需要 InvokeRequired? [复制]
【发布时间】:2014-06-13 06:57:29
【问题描述】:

我的同事喜欢这样做

if (!listbox1.InvokeRequired)
    listbox1.Items.Add(Container.error_message);
else
    listbox1.Invoke((MethodInvoker)delegate
    {
        listbox1.Items.Add(Container.error_message);
    });

为什么他必须检查 InvokedRequired?只使用这个语句会更好吗?

    listbox1.Invoke((MethodInvoker)delegate
    {
        listbox1.Items.Add(Container.error_message);
    });

【问题讨论】:

  • 是否涉及线程?
  • 是的,涉及线程

标签: c# invoke


【解决方案1】:

如果您确定该方法将从非 GUI 线程调用,则使用 InvokeRequired 毫无意义。

此外,您可以将 listbox1.Items.Add(Container.error_message); 放入一个方法中(DRY - 不要重复自己)。该方法可以在没有来自 GUI 的 InvokeRequired 和通过后台线程的 Invoke 的情况下调用。

最后,(如果有的话)通常的模式是这样的:

void AddMessageToListBox(String message)
{
    if (listbox1.InvokeRequired)
    {
        listbox1.Invoke((Action<String>)AddMessageToListBox, message);
        return;
    }

    listbox1.Items.Add(message);
}

【讨论】:

    【解决方案2】:
        // Generic delegate for cross thread processing
        private void SetProperty<T>(Control ctrl, string propertyName, T propertyValue)
        {
            if (this.InvokeRequired)
                ctrl.Invoke((Action<Control, string, T>)SetProperty, ctrl, propertyName, propertyValue);
            else
            {
                var property = ctrl.GetType().GetProperty(propertyName);
                property.SetValue(ctrl, propertyValue);
            }
        }
    
        public object DataSource
        {
            set
            {
                SetProperty(treeView, "DataSource", value);
            }
        }
    

    【讨论】:

      【解决方案3】:

      如果您确信回调线程只能到达特定路线,那么我倾向于同意您的观点 - 并不是为了避免Invoke,但只是为了避免任何重复。如果可以从多个路由到达路径,则最好进行检查以避免在非线程情况下产生任何开销,但是:重构以便每个代码路径都知道它在做什么(只需调用实用程序方法)可能更可取,即 UI 线程只调用Foo(),而工作线程使用Invoke / MethodInvoker 调用Foo()

      【讨论】:

      【解决方案4】:

      InvokeRequired 检查使代码在由 GUI 线程运行(执行第一个 if 块)和由非 GUI 线程(块的第二部分)运行时都工作。

      它看起来有点复杂,但如果按照设计,代码可以由任一线程运行,那是有道理的,至少Invoke 是必要的。据我记得,您可以选择仅按照您的建议使用Invoke,它也可以在由 GUI 线程运行时工作,但它的效率可能略低。您可能会争辩说这是微优化 - 但我建议您简单地测试两种情况下会发生什么以及它消耗了多少时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-28
        • 1970-01-01
        • 2011-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-17
        相关资源
        最近更新 更多