我想添加一個項目到窗體上的列表框,向下滾動到最後一個條目,然後刷新它。我想在並行ForEach循環中完成此操作。
爲此,我在網上找到了一個擴展方法,並將其改爲我的需要。現在,我收到錯誤消息:「跨線程操作無效:從其創建的線程以外的線程訪問控件'listBox1'」。我明白錯誤是工作線程試圖訪問列表框。事實上,我可以看到主線程可以在接收錯誤之前更新列表框。此外調試器告訴我,錯誤是在行「int visibleItems ...」
這怎麼能做到?如何添加到列表框線程安全(通過擴展方法)
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」在代表塊內部和其他時鐘內。是的,代碼重複,但應該工作 – Pyfhon
嘗試[MethodImpl(MethodImplOptions.Synchronized)]上面的函數AddItemThreadSafe' –
我試過[MethodImpl(MethodImplOptions.Synchronized)]但它不能解決問題。我也在代理塊中移動了「visibleItems」,但是這種改變導致程序凍結。 – Manngo