Cvele123 Ответов: 2

Как отменить подвешивание нити?


Hello,

i'm interested in how you can cancel hanging thread?

What I have tried:

<pre>Example:

        Public Sub FileStreamWrite(ByVal pFs As FileStream, ByVal pByPrint As Byte())

            pFs.Write(pByPrint, 0, pByPrint.Length)

        End Sub


 Dim processThreads As ProcessThreadCollection = Process.GetCurrentProcess.Threads
                        Dim newThread1 As New Thread(CType(Sub() FileStreamWrite(fs, pByPrint), ThreadStart))
                        newThread1.IsBackground = True
                        newThread1.Start()
                        Do
                            Application.DoEvents()
                            If Now.TimeOfDay.Subtract(timeStart).TotalSeconds > 10 Then
                                Select Case ShowQuestionMessage(MethodBase.GetCurrentMethod(), "Do you want to continue?", "", MessageBoxButtons.RetryCancel, MessageBoxDefaultButton.Button1)
                                    Case DialogResult.Cancel
                                        processThreads = Process.GetCurrentProcess.Threads
                                        Dim a = OpenThread(1, False, CType(processThreads(processThreads.Count - 1).Id, UInteger))
                                        Dim b = GetNativeThreadId(newThread1)
                                        Dim w = OpenThread(1, False, CType(newThread1.ManagedThreadId, UInteger))
                                        TerminateThread(w, 1)
                                        processThreads = Process.GetCurrentProcess.Threads
                                        isRepeat = False                
                                        Return
                                    Case Else
                                        timeStart = Now.TimeOfDay
                                End Select
                            End If
                        Loop While newThread1.IsAlive AndAlso isRepeat

2 Ответов

Рейтинг:
1

Richard Deeming

Вам нет необходимости использовать вызовы P/Invoke - Thread класс имеет Abort метод.

Но и этим пользоваться не стоит: Как остановить поток в .NET (и почему поток.Аборт-это зло)[^]

Было бы гораздо лучше использовать Async способ, совмещенный с CancellationToken:
Асинхронное программирование с помощью Async и Await (Visual Basic) | Microsoft Docs[^]
Отмена в управляемых потоках | Microsoft Docs[^]

Public Function FileStreamWrite(ByVal pFs As Stream, ByVal pByPrint As Byte(), ByVal cancellationToken As CancellationToken) As Task
    Return pFs.WriteAsync(pByPrint, 0, pByPrint.Length, cancellationToken)
End Function

Using cts As New CancellationTokenSource()
    Dim task As Task = FileStreamWrite(fs, pByPrint, cts.Token)
    Dim pollPeriod As TimeSpan = TimeSpan.FromSeconds(10)
    
    While Not task.Wait(pollPeriod)
        Select Case ShowQuestionMessage(...)
            Case DialogResult.Cancel
                cts.Cancel()
                task.Wait()
        End Select
    End While
End Using


Рейтинг:
0

Cvele123

Привет,

Я проверил ваш, и мы ждем задания.Подождите () также. Но в данном случае я хочу прекратить эту задачу.