ekograce Ответов: 2

Как настроить функцию тайм-аута в VB.NET


Привет,

У меня есть код, который иногда застревает в очень долгом процессе, к сожалению, это один из самых необходимых мне .поэтому я не могу избавиться от него полностью.
Назовем это ненадежным процессом()

Я хочу установить тайм-аут для этого процесса, поэтому, если он занимает более 10 минут (или любой другой установленный тайм-аут), я бы хотел, чтобы он сдался, чтобы не мешать остальным кодам работать. Как мне это сделать?


Я думал, что это будет что-то вроде этого :

Dim stopwatch As Stopwatch = New Stopwatch()
stopwatch.Start()
While stopwatch.ElapsedMilliseconds < 10000
     unreliableLongProcess()
End While


Как я должен делать это?
Любая помощь будет очень признательна, спасибо.

Что я уже пробовал:

Dim stopwatch As Stopwatch = New Stopwatch()
stopwatch.Start()
While stopwatch.ElapsedMilliseconds < 10000
     unreliableLongProcess()
End While

2 Ответов

Рейтинг:
20

Dave Kreskowiak

Самый простой способ сделать это-переместить ваш долго работающий код в задачу.


CancelationTokenSource уже имеет реализацию для CancelAfter(миллисекунды), так что это довольно легко сделать.

Отмена асинхронных задач через определенный промежуток времени (C#) | Microsoft Docs[^]


Рейтинг:
10

Garth J Lancaster

Следуя предложению Дэйва, я "думаю" (*tm, я не VB.Net Programmer) вы могли бы сделать что-то вроде

' Declare a System.Threading.CancellationTokenSource.
Dim cts As CancellationTokenSource

Private Async Sub unreliableLongProcess() as Task()

  ' Instantiate the CancellationTokenSource.
  cts = New CancellationTokenSource()

  Dim token as cts.Token
  Try
    ' Set up the CancellationTokenSource to cancel after 10 * 60 * 1000 = 10 minutes. 
    cts.CancelAfter(10*60*1000)

    ' ? is this Await redundant ?
    Await Task.Run(Sub()
      '
      ' Do slow processing here
      ' 
      token.ThrowIfCancellationRequested()
    End Sub, token)

    ' Log/Display Process is Complete

    Catch ex As OperationCanceledException
    ' Log/Display Process Canceled/Timed Out

    Catch ex As Exception
    ' Log/Display Some Other Exception Occurred
  End Try

  ' Set the CancellationTokenSource to Nothing when the process is complete.
  cts = Nothing
End Sub
И используйте его как внутри
Await unreliableLongProcess()
(Я думал об асинхронности, ожидании и т. д. В C#, прежде чем Дэйв ответил)