hesabixBox/AsyncHelper.vb

107 lines
4.2 KiB
VB.net
Raw Normal View History

2025-10-02 19:12:22 +03:30
Imports System.Threading.Tasks
Imports System.Threading
''' <summary>
''' کلاس کمکی برای مدیریت عملیات async و threading
''' </summary>
Public Class AsyncHelper
''' <summary>
''' اجرای عملیات در background thread بدون مسدود کردن UI
''' </summary>
''' <param name="action">عملیاتی که باید اجرا شود</param>
Public Shared Sub RunInBackground(action As Action)
Task.Run(action)
End Sub
''' <summary>
''' اجرای عملیات async در background thread
''' </summary>
''' <param name="asyncAction">عملیات async که باید اجرا شود</param>
Public Shared Sub RunAsync(asyncAction As Func(Of Task))
Task.Run(asyncAction)
End Sub
''' <summary>
''' اجرای عملیات در UI thread از background thread
''' </summary>
''' <param name="control">کنترل UI</param>
''' <param name="action">عملیاتی که باید در UI thread اجرا شود</param>
Public Shared Sub RunOnUIThread(control As Control, action As Action)
If control.InvokeRequired Then
control.Invoke(action)
Else
action()
End If
End Sub
''' <summary>
''' اجرای عملیات async در UI thread از background thread
''' </summary>
''' <param name="control">کنترل UI</param>
''' <param name="asyncAction">عملیات async که باید در UI thread اجرا شود</param>
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
''' <summary>
''' ایجاد CancellationTokenSource با timeout
''' </summary>
''' <param name="timeoutMs">مدت timeout به میلی‌ثانیه</param>
''' <returns>CancellationTokenSource</returns>
Public Shared Function CreateTimeoutToken(timeoutMs As Integer) As CancellationTokenSource
Return New CancellationTokenSource(timeoutMs)
End Function
''' <summary>
''' اجرای عملیات با timeout
''' </summary>
''' <param name="action">عملیاتی که باید اجرا شود</param>
''' <param name="timeoutMs">مدت timeout به میلی‌ثانیه</param>
''' <returns>True اگر عملیات موفق باشد، False اگر timeout شود</returns>
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
''' <summary>
''' اجرای عملیات با retry در صورت خطا
''' </summary>
''' <param name="action">عملیاتی که باید اجرا شود</param>
''' <param name="maxRetries">حداکثر تعداد تلاش</param>
''' <param name="delayMs">تاخیر بین تلاش‌ها به میلی‌ثانیه</param>
''' <returns>True اگر عملیات موفق باشد</returns>
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