フォーム上のリストボックスに項目を追加し、最後の項目までスクロールしてから更新したいと思います。私はこれを並列ForEachループの内部でやりたいと思います。
これを行うには、私はオンラインで拡張メソッドを見つけ、それを私のニーズに変更しました。今すぐエラーメッセージが表示されます: "クロススレッド操作が有効ではありません:コントロール 'listBox1'が作成されたスレッド以外のスレッドからアクセスされました。"私は、作業中のスレッドがListBoxにアクセスしようとしているというエラーを理解しています。実際には、エラーを受け取る前にメインスレッドがListBoxを更新できることがわかります。また、デバッガはエラーが "int visibleItems ..."という行にあることを伝えます
どうすればいいですか?ListBoxスレッドセーフ(拡張メソッド経由)に追加する方法
public static class MyClass
{
public static void AddItemThreadSafe(this System.Windows.Forms.ListBox lb, object item)
{
int visibleItems = lb.ClientSize.Height/lb.ItemHeight;
if (lb.InvokeRequired)
{
lb.Invoke(new MethodInvoker(delegate
{
lb.Items.Add(item);
lb.TopIndex = Math.Max(lb.Items.Count - visibleItems + 1, 0);
lb.Refresh();
}));
}
else
{
lb.Items.Add(item);
lb.TopIndex = Math.Max(lb.Items.Count - visibleItems + 1, 0);
lb.Refresh();
}
}
}
宣言してみてくださいデリゲートブロック内の変数 "visibleItems"とelseクロック内にあります。はい、コードの重複は、動作するはずです – Pyfhon
[AddItemThreadSafe'関数の上に[MethodImpl(MethodImplOptions.Synchronized)]を試してください –
[MethodImpl(MethodImplOptions.Synchronized)]を試しましたが、問題は解決しません。デリゲートブロック内で "visibleItems"も移動しましたが、その変更によってプログラムがフリーズします。 – Manngo