【问题标题】:Invoke from different thread从不同的线程调用
【发布时间】:2009-04-25 12:35:57
【问题描述】:

我不敢相信,这在我的其他应用程序中有效,但在这个具有类似结构的应用程序中 - 它没有!

    public string ListAdd
    {
        set
        {
            if (listView1.InvokeRequired)
            {
                this.Invoke((MethodInvoker)delegate
                {
                    listView1.Items.Add(value);
                });
            }
            else
            {
                listView1.Items.Add(value);
            }
        }
    }

我这样称呼它:

        var formz = Form.ActiveForm as Form1;
        if (formz != null)
            formz.ListAdd = "asdasdasdasd";

如果我从通过 TCP 接收数据包(我想把它放在 listView 上)的函数调用它 - 什么都不会发生,但如果我在初始化 WinSock 的同一个类中调用它 - 它可以工作。

问题可能出在哪里?

编辑: 我刚刚调试了应用程序,formz 在我调用它的地方为空(接收函数)。 为什么那里是空的,而其他地方却不是?

【问题讨论】:

  • 您不应该在属性设置器中做那样的工作,考虑将其更改为方法。

标签: c# winforms invoke


【解决方案1】:

我不认为,它会解决你的问题,但你有没有想过使用下面的模式来做调用?我认为它更具可读性。创建这个扩展方法。

public static class ControlExtension
{
   public static void ThreadSafeInvoke(this Control control, MethodInvoker method)
   {
      if (control != null)
      {
         if (control.InvokeRequired)
         {
            control.Invoke(method);
         }
         else
         {
            method.Invoke();
         }
      }
   }
}

然后你可以像这样执行线程安全的方法调用。

Form form = new Form();

form.ThreadSafeInvoke(() => form.Text = "ThreadSafeInvoke");

或一次调用多个。

form.ThreadSafeInvoke(() =>                 
{
   form.Text = "ThreadSafeInvoke";
   form.Visible = true;
   form.WindowState = FormWindowState.Maximized;
});

更新

所以问题显然是Form.ActiveForm 返回null

  1. 通话时没有活动表单。
  2. 线程无权获取活动表单 - MSDN 声明 UIPermission 是必需的。

【讨论】:

    【解决方案2】:

    如果 ActiveForm 返回 null,那么您可能没有活动表单,或者它不是 Form1 类型。您正在使用“as Form1”,因此如果您有一个处于活动状态的 Form2,那么 formz 将被设置为 null。

    你可以将 formz 传递给函数而不是调用 ActiveForm 吗?

    【讨论】:

    • 我只有一个表单,我使用 async(WSAAsyncSelect()) 进行连接。不,我不能将 Form1 分配给尚未初始化的 var。
    • 那么 Form.ActiveForm 返回什么? Null 或非 Form1 类型的表单?
    【解决方案3】:

    检查是否处于调试模式;如果是这样,则返回的 活动表单 值为 null。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      相关资源
      最近更新 更多