107 lines
4.2 KiB
VB.net
107 lines
4.2 KiB
VB.net
|
|
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
|