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