110 lines
4.5 KiB
Markdown
110 lines
4.5 KiB
Markdown
|
|
# بهبودهای Threading و عملکرد
|
|||
|
|
|
|||
|
|
## خلاصه تغییرات
|
|||
|
|
|
|||
|
|
این فایل شامل بهبودهای انجام شده برای حل مشکل کندی رابط کاربری بعد از ارسال درخواستها به سرور است.
|
|||
|
|
|
|||
|
|
## مشکلات شناسایی شده
|
|||
|
|
|
|||
|
|
1. **مسدود شدن UI**: فراخوانیهای `WebClient.DownloadString()` در تایمر اصلی باعث مسدود شدن رابط کاربری میشد
|
|||
|
|
2. **عدم مدیریت خطا**: خطاهای شبکه باعث crash شدن برنامه میشد
|
|||
|
|
3. **عدم retry**: درخواستهای ناموفق دوباره تلاش نمیشدند
|
|||
|
|
|
|||
|
|
## راهحلهای پیادهسازی شده
|
|||
|
|
|
|||
|
|
### 1. کلاس AsyncHelper.vb
|
|||
|
|
کلاس کمکی جدید برای مدیریت عملیات async و threading:
|
|||
|
|
|
|||
|
|
- `RunInBackground()`: اجرای عملیات در background thread
|
|||
|
|
- `RunAsync()`: اجرای عملیات async در background thread
|
|||
|
|
- `RunOnUIThread()`: اجرای عملیات در UI thread از background thread
|
|||
|
|
- `RunWithRetry()`: اجرای عملیات با retry در صورت خطا
|
|||
|
|
- `RunWithTimeout()`: اجرای عملیات با timeout
|
|||
|
|
|
|||
|
|
### 2. بهبودهای ApiInterface.vb
|
|||
|
|
اضافه شدن متدهای async برای تمام عملیات شبکه:
|
|||
|
|
|
|||
|
|
- `sendAsync()`: نسخه async از `send()`
|
|||
|
|
- `getLastPrintAsync()`: نسخه async از `getLastPrint()`
|
|||
|
|
- `downloadFileAsync()`: نسخه async از `downloadFile()`
|
|||
|
|
|
|||
|
|
### 3. بهبودهای Form1.vb
|
|||
|
|
- تبدیل `Timer1_Tick` به async
|
|||
|
|
- اضافه شدن `ProcessPrintingAsync()` برای پردازش چاپ
|
|||
|
|
- استفاده از نشانگر وضعیت `isProcessingPrint` برای جلوگیری از اجرای همزمان
|
|||
|
|
- پیادهسازی retry و error handling بهتر
|
|||
|
|
|
|||
|
|
## مزایای پیادهسازی
|
|||
|
|
|
|||
|
|
### 1. عملکرد بهتر
|
|||
|
|
- **عدم مسدود شدن UI**: تمام عملیات شبکه در background thread اجرا میشوند
|
|||
|
|
- **پاسخگویی بهتر**: رابط کاربری همیشه responsive است
|
|||
|
|
- **مدیریت منابع**: جلوگیری از اجرای همزمان چندین عملیات
|
|||
|
|
|
|||
|
|
### 2. قابلیت اطمینان بیشتر
|
|||
|
|
- **Retry mechanism**: درخواستهای ناموفق دوباره تلاش میشوند
|
|||
|
|
- **Error handling**: مدیریت بهتر خطاها
|
|||
|
|
- **Timeout management**: جلوگیری از hang شدن برنامه
|
|||
|
|
|
|||
|
|
### 3. تجربه کاربری بهتر
|
|||
|
|
- **عدم freeze**: رابط کاربری دیگر freeze نمیشود
|
|||
|
|
- **نمایش وضعیت**: امکان نمایش وضعیت عملیات در حال انجام
|
|||
|
|
- **لاگ بهتر**: ثبت بهتر خطاها و وضعیت عملیات
|
|||
|
|
|
|||
|
|
## نحوه استفاده
|
|||
|
|
|
|||
|
|
### اجرای عملیات async
|
|||
|
|
```vb
|
|||
|
|
' اجرای عملیات در background
|
|||
|
|
AsyncHelper.RunAsync(AddressOf MyAsyncMethod)
|
|||
|
|
|
|||
|
|
' اجرای عملیات با retry
|
|||
|
|
Dim success As Boolean = Await AsyncHelper.RunWithRetry(
|
|||
|
|
Async Function()
|
|||
|
|
Return Await api.getLastPrintAsync()
|
|||
|
|
End Function, 3, 2000) ' 3 تلاش با تاخیر 2 ثانیه
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### اجرای عملیات در UI thread
|
|||
|
|
```vb
|
|||
|
|
' از background thread به UI thread
|
|||
|
|
AsyncHelper.RunOnUIThread(Me, Sub()
|
|||
|
|
' عملیات UI
|
|||
|
|
End Sub)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## تنظیمات پیشنهادی
|
|||
|
|
|
|||
|
|
### Timeout ها
|
|||
|
|
- دریافت آخرین چاپ: 30 ثانیه
|
|||
|
|
- دانلود فایل: 60 ثانیه
|
|||
|
|
- تست اتصال: 10 ثانیه
|
|||
|
|
|
|||
|
|
### Retry Policy
|
|||
|
|
- دریافت آخرین چاپ: 3 تلاش با تاخیر 2 ثانیه
|
|||
|
|
- دانلود فایل: 2 تلاش با تاخیر 3 ثانیه
|
|||
|
|
|
|||
|
|
## نکات مهم
|
|||
|
|
|
|||
|
|
1. **Thread Safety**: تمام عملیات UI باید در UI thread اجرا شوند
|
|||
|
|
2. **Resource Management**: استفاده از `Using` برای مدیریت منابع
|
|||
|
|
3. **Error Logging**: ثبت تمام خطاها در Logger
|
|||
|
|
4. **Performance Monitoring**: نظارت بر عملکرد و زمان پاسخ
|
|||
|
|
|
|||
|
|
## تست و اعتبارسنجی
|
|||
|
|
|
|||
|
|
برای تست عملکرد:
|
|||
|
|
|
|||
|
|
1. اجرای برنامه و بررسی عدم freeze شدن UI
|
|||
|
|
2. قطع اتصال اینترنت و بررسی retry mechanism
|
|||
|
|
3. تست با سرور کند و بررسی timeout handling
|
|||
|
|
4. بررسی لاگها برای خطاها و عملکرد
|
|||
|
|
|
|||
|
|
## نتیجهگیری
|
|||
|
|
|
|||
|
|
این بهبودها باعث شدهاند که:
|
|||
|
|
- رابط کاربری همیشه responsive باشد
|
|||
|
|
- عملیات شبکه در background اجرا شوند
|
|||
|
|
- خطاها بهتر مدیریت شوند
|
|||
|
|
- تجربه کاربری بهبود یابد
|