我在VB .Net中使用MySQL连接器来执行一批SQL插件.这通常是5k语句的顺序,大约需要30分钟来处理.不幸的是,当这个进程正在运行并且我在系统上使用不同的应用程序时,在返回到.net应用程序时,它会挂起并显示"没有响应".实际上,只要我单击应用程序中的任何其他位置(例如,移动到其他选项卡),一切都会锁定.
Dim transaction As MySqlTransaction = sqlConnection.BeginTransaction()
For Each sqlCmd In (sqlCmdsCollection)
sqlCommand = New MySqlCommand(sqlCmd, sqlConnection)
Try
sqlCommand.ExecuteNonQuery()
logTxtBox.AppendText(". ")
Catch ex As Exception
transaction.Rollback()
logTxtBox.AppendText(vbNewLine & "EXCEPTION: " & ex.Message & vbNewLine)
logTxtBox.AppendText(sqlCmd & vbNewLine)
logTxtBox.AppendText("INFO: No changes were made to the database!"& vbNewLine)
End Try
Next
transaction.Commit()
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
有没有更有效的方法来执行这些插入?
谢谢-
乔纳森
这是因为您在UI线程上调用这个长时间运行的操作,这意味着它正在阻塞,并且在运行时您无法使用UI.
对于短期运行操作,您可以创建一个处理工作并委托异步调用的委托,并使用Control.BeginInvoke确保更新UI线程上的UI.
任何超过几秒钟的事情,正如亚当指出的那样,你最好创建自己的线程并在那里处理你的工作.
话虽如此,5000插入应该不需要 30分钟运行.但这本身就是另一个问题.