我不敢相信,这在我的其他应用程序中有效,但在这个具有类似结构的应用程序中 - 它不起作用!
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
.
- 通话时没有活动表格。
- 该线程没有权限获取活动表单 -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(使用前将#替换为@)