Я знаю, что Thread.Abort() не совсем безопасно, но я не могу себе представить, что это может привести в случае ниже:Как избежать Thread.Abort() в этом случае?
Private threadLoadList As Thread
Private Sub LoadList(ByVal argument As Integer)
Try
Refresh_Grid(GET_DATA(argument), argument) 'Fills grid with data loaded from database
Change_Cursor() 'Changes cursor to Cursor.Default
Catch ex As ThreadAbortException
'Do nothing
Catch ex As Exception
Error_log(ex.Message) ' Saves ex.Message in database
End Try
End Sub
Private Sub SomeValueChanged(sender As Object, e As EventArgs) Handles Control.ValueChanged
If Not threadLoadList Is Nothing Then
If threadLoadList.IsAlive Then
threadLoadList.Abort()
End If
End If
Cursor = Cursors.WaitCursor
threadLoadList = New Thread(AddressOf LoadList)
threadLoadList.Start(1)
End Sub
Как вы можете видеть, пользователь может изменить некоторые значения (ComboBox) и в результате изменить содержимое сетки. Функция GET_DATA() занимает около 10 секунд, таким образом, возможно, что пользователь изменит значение Combobox до обновления сетки - вот почему ранее начатый поток убит.
Опасно ли это? Если да, можете ли вы предложить какое-то другое решение?
Хорошо, я понимаю;). Я стараюсь, чтобы избежать тайм-аута (в некоторых случаях запрос выполняется менее 1 секунды) Это лучшее решение:
Private threadLoadList As Thread
Private Changed As Boolean = False
Private Sub LoadList(ByVal argument As Integer)
Try
Dim dt As DataTable = GET_DATA(argument)
'Enter Monitor
If Changed Then
Return
End IF
'Exit Monitor
Refresh_Grid(dt, argument) 'Fills grid with data loaded from database
Change_Cursor() 'Changes cursor to Cursor.Default
'Enter Monitor
Changed = False
'Exit Monitor
Catch ex As ThreadAbortException
'Do nothing
Catch ex As Exception
Error_log(ex.Message) ' Saves ex.Message in database
End Try
End Sub
Private Sub SomeValueChanged(sender As Object, e As EventArgs) Handles Control.ValueChanged
'Enter Monitor
Changed = True
'Exit Monitor
Cursor = Cursors.WaitCursor
Dim t As Thread = New Thread(AddressOf LoadList)
t.Start(1)
End Sub
Да, это опасно. Что, если AbortException происходит внутри предложения finally внутри Refresh_Grid()? –