【发布时间】:2016-07-12 02:31:42
【问题描述】:
我已尝试进行一些搜索,但在我的一生中,我似乎无法找到答案或可行的建议解决方案。这可能是我的理解,但希望问我自己的问题会给我一个有效的答案:o)
我有一个 Windows 窗体应用程序,它由一个项目组成,ListView1
这个 ListView 有通过拖放从文件中添加到它的项目,这是在主 UI 线程上完成的,没有后台工作程序,它由大约 1500 行组成。
我现在正试图让后台工作人员读取此 ListView,但由于 ListView1 不是在同一个线程上创建的,所以我遇到了跨线程错误。
错误出现在最简单的代码片段上,但我似乎无法想出解决方法或实现调用等。
For i = 0 To Me.ListView1.Items.Count - 1
ValueStatement = ValueStatement & "(" & Me.ListView1.Items(i).SubItems(0).Text
If i = Me.ListView1.Items.Count - 1 Or counter = 500 Then
CommaTerminate = ";"
Else
CommaTerminate = ","
End If
For y = 0 To Me.ListView1.Columns.Count - 1
ValueStatement = ValueStatement & "'" & Me.ListView1.Items(i).SubItems(y).Text & "'"
If y = Me.ListView1.Columns.Count - 1 Then
ValueStatement = ValueStatement & ")"
Else
ValueStatement = ValueStatement & ","
End If
Next
ValueStatement = ValueStatement & CommaTerminate & vbNewLine
If counter = 500 Then
SQLStatement = "INSERT INTO RAW_CLI_DATA_" & GlobalVariables.CDR_Company & " VALUES " & vbNewLine & ValueStatement
GenericDatabaseRequest(SQLStatement, "Loading RAW table with data..")
counter = 0
ValueStatement = ""
End If
counter = counter + 1
Next
错误来了ValueStatement = ValueStatement & "(" & Me.ListView1.Items(i).SubItems(0).Text一行
感谢您的帮助!
【问题讨论】:
-
你为什么使用
BackgroundWorker?您是否在加载项目时尝试阅读它们? -
我正在尝试使它在读取数据时不会锁定 UI,因为它会在后台将其放入数据库中。我希望 UI 显示一个加载图标,以便最终用户知道发生了什么事。
-
那么您想在后台线程上进行 IO 操作并在处理文件内容时逐步更新 ListView?我问,因为,在您的示例代码中,您试图在前台线程上运行代码以构建一个字符串 - 目前尚不清楚您为什么要这样做。
-
我有在后台线程上填充 ListView 的代码(我没有这样做,仅供参考),但这个问题只是读取 ListView 中的数据。我正在构建一个语句,该语句将在该过程的后期生成一个 SQL 语句,但主要问题不是字符串的构建,而是
For Each ListItem... -
您使用的是
ReportProgress方法吗?然后处理ProgressChanged事件以更新 UI。您可能会发布更多代码以获得更多帮助....
标签: vb.net multithreading listview backgroundworker