hesabixBox/THREADING_IMPROVEMENTS.md
2025-10-02 19:12:22 +03:30

4.5 KiB
Raw Permalink Blame History

بهبودهای 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

' اجرای عملیات در 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

' از 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 اجرا شوند
  • خطاها بهتر مدیریت شوند
  • تجربه کاربری بهبود یابد