【发布时间】:2020-03-10 02:56:21
【问题描述】:
我正在使用 WinForms。 我想从后台线程填充 ListView,但是当我调用 listview 时,我的程序停止并显示错误。错误是“无法访问已处置的对象。对象名称是:ListView。”而当我把这个方法
lvValidate.Invoke((Action)delegate
{
lvValidate.Items.Add(listitem);
});
在 try-catch 块中,我的程序开始滞后。我不知道问题出在哪里,但我的 Invoke 方法是:
static class Intercept
{
internal static void Invoke(this Control control, Action action)
{
control.Invoke(action);
}
}
该错误仅在我关闭表单并打开另一个表单(在同一程序中)时显示。在包含 ListView 的表单中,数据不可读,并且似乎加载了数千次。
这就是我的 DoWork,ProgressChanged,RunWorkerCompleted 事件的作用。
private void bgwLoad_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
string commandText = "SELECT * FROM works";
MySqlCommand command = new MySqlCommand(commandText, connection);
MySqlDataAdapter da = new MySqlDataAdapter(command);
connection.Close();
connection.Open();
reader = command.ExecuteReader();
connection.Close();
DataTable dt = new DataTable();
da.Fill(dt);
for (int i = 0; i < dt.Rows.Count; i++)
{
DataRow dr = dt.Rows[i];
ListViewItem listitem = new ListViewItem(dr["ID"].ToString(), dr["Date"].ToString());
listitem.SubItems.Add(dr["Date"].ToString());
listitem.SubItems.Add(dr["Name"].ToString());
listitem.SubItems.Add(dr["WorkNumber"].ToString());
listitem.SubItems.Add(dr["WorkCode"].ToString());
listitem.SubItems.Add(dr["CoreThread"].ToString());
listitem.SubItems.Add(dr["Tech"].ToString());
listitem.SubItems.Add(dr["From"].ToString());
listitem.SubItems.Add(dr["To"].ToString());
listitem.SubItems.Add(dr["Validate"].ToString());
listitem.SubItems.Add(dr["Validate2"].ToString());
lvValidate.Items.Add(listitem);
}
}
private void bgwLoad_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
}
private void bgwLoad_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
picLoading.Visible = false;
}
【问题讨论】:
-
显然你已经废弃了 ListView。或者可能只是里面的东西?
-
不清楚您的显示技术(以及 ListView)是什么:WinForms? WPF? ASP.NET?其他?
-
一般我在后台使用report progress的方式,将数据发送到ListView所在的主线程。然后在报告进度方法中将数据发送到列表视图。
-
@Christopher WinForms 是技术
-
@Christopher 我不知道我处理了什么。代码中没有手动处理任何内容。
标签: c# multithreading user-interface background