1

私は実行時に別のスレッドからチェックリストボックスに項目を追加する必要がある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 値を返すためです。

この問題を解決する方法を教えてください。前もって感謝します。

4

1 に答える 1

3

Control.InvokeRequired既に UI スレッドにいる場合は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 プロパティ

呼び出し元が、コントロールが作成されたスレッドとは異なるスレッド上にあるため、呼び出し元がコントロールに対してメソッド呼び出しを行うときに、invoke メソッドを呼び出す必要があるかどうかを示す値を取得します。

于 2013-09-30T10:22:08.760 に答える