【问题标题】:How to remove items from the CheckListBox (windows application) from another thread?如何从另一个线程的 CheckListBox(Windows 应用程序)中删除项目?
【发布时间】: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


【解决方案1】:
当您已经在 UI 线程上时,

Control.InvokeRequired 返回 false。试试这个:

delegate method = new MethodInvoker(delegate
{ 
    chkLBClientsList.Items.Remove(GetHostNameByIpAddress(GetIpAddress(client))); 
};
if (chkLBClientsList.InvokeRequired)
   chkLBClientsList.Invoke(method));
else method();

如果InvokeRequiredfalse,则无需调用即可完成工作。

显然,您需要为您的 Add 方法执行类似操作。

编辑 - InvokeRequired 的 MSDN 文档将是您开始的好地方。 http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx

Control.InvokeRequired 属性

获取一个值,指示调用者是否必须调用调用方法 在对控件进行方法调用时,因为调用者在 与创建控件的线程不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-08
    • 2011-05-16
    • 2023-03-10
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 2021-03-04
    相关资源
    最近更新 更多