Я используюVB.NET MySQL иногда, но не всегда замораживание всего приложения
- vb.NET 2013
- Framework 2.0
- ODBC соединение с .Net Framework
- ODBC MySQL Connector 3,51
Иногда, но не всегда, когда я запрашиваю базу данных, программа перестает отвечать, и ошибки вообще нет.
После перезапуска приложения и повторного запуска точно так же, все работает так, как должно.
Function GetData(ByVal xxx1 As Integer, ByVal xxx2 As DateTime, ByVal xxx3 As DateTime) As DataTable
Dim dt As DataTable = NewDT.GetData
Try
SyncLock Master_Con
Using cmd As New OdbcCommand(myCmdStr, Master_Con)
cmd.CommandTimeout = SQLCmd.intCmdTimeout '3
cmd.Parameters.Add("xxx1", OdbcType.Int).Value = xxx1
cmd.Parameters.Add("xxx2", OdbcType.NVarChar).Value = xxx2
cmd.Parameters.Add("xxx3", OdbcType.NVarChar).Value = xxx3
Using dr As OdbcDataReader = cmd.ExecuteReader
If dr.HasRows Then
Dim rowcount As Integer = 0
While dr.Read()
dt.Rows.Add()
For count As Integer = 0 To (dr.FieldCount - 1)
dt.Rows(rowcount).Item(count) = dr(count)
Next
rowcount = rowcount + 1
End While
End If
End Using
End Using
End SyncLock
Catch OdbcEx As OdbcException
MessageBox.Show("ODBC-Fehler bei Funktion 'GetData'. " & vbCrLf & vbCrLf & OdbcEx.Message, "App", MessageBoxButtons.OK, MessageBoxIcon.Error)
Catch ex As Exception
MessageBox.Show("Systemfehler bei Funktion 'GetData'. " & vbCrLf & vbCrLf & ex.Message, "App", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
Debug.WriteLine("done.")
Return dt
End Function
Мой журнал говорит что-то вроде этого:
GetData (28.08.15 - 28.08.15)... done.
GetData2 (28.08.15)... done.
DelData... done.
GetData (28.08.15 - 28.08.15)... done.
GetData2 (28.08.15)... done.
GetData (27.08.15 - 27.08.15)... done.
GetData2 (27.08.15)... done.
GetData (26.08.15 - 26.08.15)...
Программа просто продолжает не отвечать во время работы cmd.ExecuteReader. Поскольку я запускаю команду точно так же, как много раз, я предполагал, что она имеет какое-то отношение к таймауту или серверу mysql/соединение занято.
Но так как он никогда не вызывает ошибку/odbc, и это происходит только каждый раз, а затем я не знаю, как его решить.
Любая помощь будет приятной!
Наиболее вероятной причиной для заморозки приложения является то, что поток графического интерфейса занят, и внешний вид формы не может быть обновлен. В вашем случае, я думаю, что несколько раз данные извлекаются быстрее, чтобы вы заметили замораживание. Наилучшее решение в этих случаях опирается на многопоточность (т. Е. Выполнение деталей слишком долго в другом потоке); BackgroundWorker весьма удобен для подобных ситуаций. Здесь у вас есть несколько простых примеров, показывающих, как их реализовать: http://www.dotnetperls.com/backgroundworker-vbnet – varocarbas
С другой стороны, невозможно понять, почему в некоторых случаях ваше соединение происходит медленнее (или даже полностью застряло). Вы должны тщательно анализировать свои специфические условия; и, в конце концов, опубликуйте вопрос, четко описывающий их (не в этом случае), чтобы кто-то мог что-то предложить. – varocarbas
Я просил информацию о том, что искать или анализировать. -> Поместить его в собственный поток, возможно, но разве это не обходное решение? Возможно, поток тоже замерзнет. Тогда я должен сделать собственный тайм-аут и убить его. Если это единственное решение ...:/ – Duashdae