【发布时间】:2013-09-30 10:18:57
【问题描述】:
我正在开发一个 Windows 应用程序,我需要在运行时从单独的线程中添加清单框中的项目,因为我使用了:
if (chkLBClientsList.InvokeRequired)
chkLBClientsList.Invoke(new MethodInvoker(delegate{chkLBClientsList.Items.Add(GetHostNameByIpAddress(ipAddress));}));
稍后在应用程序中,我需要从清单框中删除项目,为此我使用相同的逻辑:
if (chkLBClientsList.InvokeRequired)
chkLBClientsList.Invoke(new MethodInvoker(delegate { chkLBClientsList.Items.Remove(GetHostNameByIpAddress(GetIpAddress(client))); }));
但它不起作用....因为这条语句 chkLBClientsList.InvokeRequired 返回 FALSE 值。
请告诉我如何解决这个问题? 提前致谢。
【问题讨论】:
-
你确定你在另一个线程吗?设置一个 else 条件并删除它
-
同意您可能已经在主线程上。您是从 System.Windows.Forms.Timer 事件中调用的吗?那些在主线程上。此外,如果您从 System.Timers.Timer 事件调用,您可能已将 SynchronizingObject 设置为主线程中的对象,在这种情况下您也可以。
-
@Sriram Sakthivel :是的,我在另一个线程中。你的把戏会奏效,但我想知道为什么“chkLBClientsList.InvokeRequired”返回一个假值?
-
检查我的答案here。是错误的,因为您正在另一个线程中创建
chkLBClientsList本身的实例。不是 UI 线程 -
你们说的都对,我在主线程已经不在另一个线程了。
标签: c# .net multithreading winforms