0

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
4

1 に答える 1

1

まず最初にRefresh_Grid、UI スレッド以外のスレッドから UI 要素を変更しようとしているように見えない余分なコードがない限り。それは大したことではありません。UI 要素は UI スレッドからのみアクセスできるように設計されているため、ワーカー スレッドで UI 要素を変更しようとすると、予期しない動作が発生します。

Thread.Abort答えの使用法に関しては、はいです。危険です。アプリケーションが例外をスローしたり、データを破損したり、クラッシュしたり、時空に穴を開けたりするという意味では危険です。スレッドを中止することで予想されるあらゆる種類の障害モードがあります。最善の解決策は、ハード アボートを行う代わりに協調的終了プロトコルを使用することです。有効なアプローチの簡単な紹介については、こちらの回答を参照してください。

于 2013-07-23T14:52:25.647 に答える