با سلام
چرا زمانی که چندین Thread یک منبع رو درخواست میکنن در صورت delay در اون منبع همه ی thread ها به هم گره میخورن ؟!
ParallelLoopResult resultLoop = Parallel.ForEach(requestList, item => { DateTime sendRequset = DateTime.Now; var value = Process(); //Thread.Sleep(100); //Manual Delay //for (int i = 0; i < 10000000; i++) ; //Manual Delay DateTime getResponse = DateTime.Now; Result result = new Result() { ThreadId = Thread.CurrentThread.ManagedThreadId.ToString(), SendRequestAt = sendRequset.ToString("hh:mm:ss.fff"), GetResponseAt = getResponse.ToString("hh:mm:ss.fff"), Duration = (getResponse - sendRequset).ToString(), Value = value }; lock (resultList) { resultList.Add(result); } });
یکی از دو خطی که کامنت کردم رو اگه اجرا کنم تا delay ایجاد شه همه Thread ها به هم گره میخورن!
حتی اگه این تاخیر رو در تابع process ایجاد کنم و داخل parallel foreach نباشه بازم همه به هم گره می خورن!
یعنی تا اولی پاسخ داده نشه بقیه اجرا نمیشن
دلیلش چیه ؟!
چیکار باید بکنم که گره نخورن به هم
با Thread هم تست گردم نتیجه اش همین بود و فرقی ندارن با هم
وقتی از parallel استفاده می کنید خودش همروندی براساس تعداد پردازنده های منطقی کامپیوتر مدیریت می کند و تا پایان اجرای تمامی متدها نخ فراخواندهنده بلاک می شود.
برای اطلاعات بیشتر در مورد کار با نخ ها کتاب برنامه نویسی وظیفه ای فصل 26 27 مهندس منصور عمرانی از انتشارات پندار پارس رو مطالعه کنید.
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)