C# 如何从另一个线程中删除复选框(windows应用程序)中的项目?

C# 如何从另一个线程中删除复选框(windows应用程序)中的项目?,c#,.net,multithreading,winforms,C#,.net,Multithreading,Winforms,我正在开发一个windows应用程序,在该应用程序中,我需要在运行时从单独的线程将项目添加到检查表框中,为此我使用了: if (chkLBClientsList.InvokeRequired) chkLBClientsList.Invoke(new MethodInvoker(delegate{chkLBClientsList.Items.Add(GetHostNameByIpAddress(ipAddress));})); 稍后在应用程序中,我需要从检查表框中删除项目,为此我使用相同的

我正在开发一个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
返回假值

请告诉我如何解决这个问题?
提前感谢。

控件。当您已经在UI线程上时,InvokeRequested
返回false。试试这个:

delegate method = new MethodInvoker(delegate
{ 
    chkLBClientsList.Items.Remove(GetHostNameByIpAddress(GetIpAddress(client))); 
};
if (chkLBClientsList.InvokeRequired)
   chkLBClientsList.Invoke(method));
else method();
如果
invokererequired
false,只需执行工作而不调用

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

编辑-InvokeRequired的MSDN文档对于您来说是一个很好的开始

Control.invokererequired属性

获取一个值,该值指示调用方是否必须调用调用方法 由于调用方位于 与在其上创建控件的线程不同


你确定你在另一条线上吗?设置一个else条件并删除它,因为您可能已经在主线程上了。您是从System.Windows.Forms.Timer事件调用的吗?那些在主线上。另外,如果您是从System.Timers.Timer事件调用,则可能已将SynchronizingObject设置为主线程中的对象,在这种情况下,您也可以。@Sriram Sakthivel:是的,我在另一个线程中。你的技巧会奏效,但我想知道为什么“chkLBClientsList.InvokeRequired”返回假值?请检查我的答案。为false,因为您正在另一个线程中创建
chkLBClientsList
自身的实例。不是UI线程你们都是对的,我已经在主线程中,而不是在另一个线程中。