从不同线程调用

2024-02-18

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

    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 的同一个类中调用它 - 它可以工作。

问题可能出在哪里?

EDIT:我刚刚调试了应用程序,formz 在我调用它的地方(接收函数)为空。 为什么那里是 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;
});

UPDATE

那么问题就很明显了Form.ActiveForm返回null.

  1. 通话时没有活动表格。
  2. 该线程没有权限获取活动表单 -MSDN http://msdn.microsoft.com/en-us/library/system.windows.forms.form.activeform(loband).aspx指出UI权限 http://msdn.microsoft.com/en-us/library/system.security.permissions.uipermission.aspx是必须的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从不同线程调用 的相关文章

随机推荐