[英]Multi-thread C# application with BindingList<T> and DataGridView
我的public static class MyGlobals
用於我的應用程序范圍的變量以及處理和更改這些變量的多線程。
public static class MyGlobals
{
public static BindingList<Device> devicesList;
public static BindingList<Device> availableList;
public static object listLock = new object();
}
我有一個Timer
線程,用於更新列表的一部分(例如Device.status
字段)和UI線程,其中這些列表綁定到DataGridView
表,並且某些字段(例如Device.description
字段)可以在此處手動編輯。
我的問題是,當Timer線程想要更新綁定列表內容時,我會收到InvalidOperationException
:
Additional information: Cross-thread operation not valid: Control 'gridView1' accessed from a thread other than the thread it was created on.
我在修改MyGlogals
列表的每個代碼塊周圍使用lock(listLock)
語句,但無法控制DataGridView
如何處理列表。 如何使該應用程序線程安全?
您不能從其他線程更新UI線程。
您可以使用這篇文章來幫助您解決它:例如
foreach (Device device in MyGlobals.devicesList)
{
Invoke(new MethodInvoker(delegate {
device.text = "newText";
}));
}
或使用后台工作者 :
BackgroundWorker bg = new BackgroundWorker();
bg.DoWork += new DoWorkEventHandler(bg_DoWork);
bg.RunWorkerAsync();
並在bg_DoWork中:
void bg_DoWork(object sender, DoWorkEventArgs e)
{
foreach (Device device in MyGlobals.devicesList)
{
device.text = "newText";
}
}
GUI本身需要從GUI線程(主線程)進行更新。 .NET為此提供了BackgroundWorker類。 可以通過/或ProgressChanged和RunWorkerCompleted事件完成與GUI的通信,您可以在其中傳遞選擇的對象(例如,要顯示的對象)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.