繁体   English   中英

从其他线程调用

[英]Invoke from different thread

我不敢相信,这可以在我的其他应用程序中使用,但是在这个具有类似结构的应用程序中-不能!

    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为null(接收函数)。 为什么在这里为null,但在其他任何地方都没有?

我认为这不会解决您的问题,但是您是否考虑过使用以下模式进行调用? 我认为它更具可读性。 创建此扩展方法。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM