PDA

View Full Version : آموزش: مراقب استفاده از HttpClient باشید



EnKamran
چهارشنبه 25 مهر 1397, 16:46 عصر
سلام دوستان
تو یکی از پروژه های اخیر که کار میکردم به یه مشکل خیلی جالب برخوردم که فکر میکنم بیشتر شما هم همین مشکل رو دارید.
جریان از این قرار بود که بعذ از یه مدتی که پروژه کارش رو شروع کرده بود و درخواست ها زیاد شده بودن پرفرمنس خیلی اومده بود پایین و واقعا نرم افزار ناپایدار بود، از دسترس خارج میشد و خطا میداد! ریز به ریز کدها رو بررسی کردم هیچ مشکلی نبود یعنی مشکلی که باعث این ناپایداری بشه نبود، خیلی اتفاقی کانکشن ها رو بررسی میکردم که متوجه شدم کانکشن هایی که باز میشن بسته نمیشن تا یه مدت (کوتاه) با یه حساب سرانگشتی دیدم بله همین جریان داره باعث ناپایداری میشه.
وقتی از بلاک using برای HttpClient استفاده میکنیم این مشکل پیش میاد و ویندوز 240 ثانیه هر کانکشن رو باز نگه میداره تا ببینه درخواستی میاد یا نه (ممکنه وسط راه مشکل شبک یا هرچیزی باشه و درخواست دیر به سرور برسه برای همین منتظر میمونه) و دقیقا مشکل همینجا بود، که بعد از استفاده از یک نمونه استتیک از HttpClient و دیدن نتایج و آنالیز تفاوت خیلی زیادی رو دیدم.
نکته جالب این قسمتش بود که همه ما از using استفاده میکنیم و طبق گفته خود مایکروسافت خیلی هم خوبه اما تو این یک مورد باعث همچین مشکلی میسه.

متن کامل مقاله با تصاویر و کدهای پروژه نمونه و همینطور سورس کد پروژه نمونه رو تو سایت گذاشتم میتونید ببینید : https://sadin.ir/Articles/Article/big-mistake-in-using-httpclient

mehdiyahyavi
چهارشنبه 25 مهر 1397, 23:55 عصر
مطلب جالبی بود. اما میشه از یه دید دیگه هم به این قضیه نگاه کرد و Using رو برای استفاده از HttpClient رد نکرد.

بزرگترین مشکلی که توی نمونه کد مقاله مورد نظر بود، این بود که از Using در حلقه For استفاده کردن. این کار از پایه اشتباه هست. ما هیچ وقت Using رو در یک حلقه قرار نمیدیم که دائما تکرار شه. وقتی این اتفاق بیفته، حتی اگر HttpClient هم نباشه ترافیک منابع میره بالا. با یه تغییر ساده کد و عوض کردن جای حلقه For و بلاک Using مشکل حل میشه :چشمک:
در مورد 240 ثانیه صحبت شما سر جاش باقی میمونه اما این اتفاق وقتی رخ میده که حلقه تمام شده(فرض میکنیم که فعالیت کاربر به پایان رسیده) و ما سروریس رو قطع می کنیم. اگر از Using هم استفاده نکنیم، باید متد Dispose رو برای سرویس فراخونی کنیم

EnKamran
چهارشنبه 02 آبان 1397, 16:28 عصر
صحبت شما کاملا درسته دوست عزیز، اینجا برای شبیه سازی ترافیک از حلقه استفاده شده، بنده هم عرض کردم در مقاله که طی چندین سالی که کار میکردم به این مشکل بر نخورده بودم و در یکی از پروژه هایی که ترافیک بسیار بالایی نیاز داشت به این مشکل بر خوردیم و این در حالی بود که از حلقه هم استفاده نشده بود. شما در نظر بگیرید که بحای حلقه تعداد درخواست ها بیشتر بشه باز هم همین مشکل پیش خواهد اومد.