Imports System.Threading.Tasks
Imports System.Threading
'''
''' کلاس کمکی برای مدیریت عملیات async و threading
'''
Public Class AsyncHelper
'''
''' اجرای عملیات در background thread بدون مسدود کردن UI
'''
''' عملیاتی که باید اجرا شود
Public Shared Sub RunInBackground(action As Action)
Task.Run(action)
End Sub
'''
''' اجرای عملیات async در background thread
'''
''' عملیات async که باید اجرا شود
Public Shared Sub RunAsync(asyncAction As Func(Of Task))
Task.Run(asyncAction)
End Sub
'''
''' اجرای عملیات در UI thread از background thread
'''
''' کنترل UI
''' عملیاتی که باید در UI thread اجرا شود
Public Shared Sub RunOnUIThread(control As Control, action As Action)
If control.InvokeRequired Then
control.Invoke(action)
Else
action()
End If
End Sub
'''
''' اجرای عملیات async در UI thread از background thread
'''
''' کنترل UI
''' عملیات async که باید در UI thread اجرا شود
Public Shared Async Function RunOnUIThreadAsync(control As Control, asyncAction As Func(Of Task)) As Task
If control.InvokeRequired Then
Await Task.Run(Sub() control.Invoke(asyncAction))
Else
Await asyncAction()
End If
End Function
'''
''' ایجاد CancellationTokenSource با timeout
'''
''' مدت timeout به میلیثانیه
''' CancellationTokenSource
Public Shared Function CreateTimeoutToken(timeoutMs As Integer) As CancellationTokenSource
Return New CancellationTokenSource(timeoutMs)
End Function
'''
''' اجرای عملیات با timeout
'''
''' عملیاتی که باید اجرا شود
''' مدت timeout به میلیثانیه
''' True اگر عملیات موفق باشد، False اگر timeout شود
Public Shared Async Function RunWithTimeout(action As Func(Of Task), timeoutMs As Integer) As Task(Of Boolean)
Using cts As CancellationTokenSource = CreateTimeoutToken(timeoutMs)
Try
Await Task.Run(action, cts.Token)
Return True
Catch ex As OperationCanceledException
Return False
End Try
End Using
End Function
'''
''' اجرای عملیات با retry در صورت خطا
'''
''' عملیاتی که باید اجرا شود
''' حداکثر تعداد تلاش
''' تاخیر بین تلاشها به میلیثانیه
''' True اگر عملیات موفق باشد
Public Shared Async Function RunWithRetry(action As Func(Of Task), maxRetries As Integer, delayMs As Integer) As Task(Of Boolean)
For i As Integer = 0 To maxRetries - 1
Try
Await action()
Return True
Catch ex As Exception
If i = maxRetries - 1 Then
Logger.Instance.LogError($"عملیات بعد از {maxRetries} تلاش ناموفق بود", ex)
Return False
End If
Logger.Instance.LogInfo($"تلاش {i + 1} ناموفق بود، تلاش مجدد در {delayMs} میلیثانیه...")
End Try
' تاخیر خارج از Catch block
If i < maxRetries - 1 Then
Await Task.Delay(delayMs)
End If
Next
Return False
End Function
End Class