مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

salman_b

عضویت از 1396/02/18

برنامه نویسی NoneBlocking در WEb Api

  • جمعه 21 اردیبهشت 1397
  • 12:29
تشکر میکنم

با سلام

کنترلر ساده ی زیر رو در نظر بگیرید

    [RoutePrefix("api")]    
    public class DefaultController : ApiController
    {
        [HttpGet]
        [Route("get")]
        public async Task<string> Get()
        {            
            return await Task.Factory.StartNew(() => { return DateTime.Now.ToString("hh:mm:ss.fff"); });
        }
    }

خب حالا میخوام با استفاده از Parallel Froeach که کار همون چندین Thread همزمان رو انجام میده درخواست هایی همزمان رو به این کنترلر ارسال کنم

خب اینم کد کلاینت

    class Program
    {
        static Uri hostUri = new Uri("http://localhost:22824");        
        static HttpClient client;

        static void Main(string[] args)
        {
            client = new HttpClient();
            client.BaseAddress = hostUri;
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            List<Result> resultList = new List<Result>();
            List<string> valueList = new List<string>();
            for (int i = 0; i < 1000; i++)
            {
                valueList.Add(i.ToString());
            }

            var start = DateTime.Now;
            Parallel.ForEach(valueList, async value =>
             {
                 var sendReq = DateTime.Now;
                 var response = await client.GetStringAsync("api/get");
                 var getRes = DateTime.Now;

                 var result = new Result()
                 {
                     ThreadId = Thread.CurrentThread.ManagedThreadId.ToString(),
                     SendRequest = sendReq,
                     GetResponse = getRes,
                     Value = response
                 };

                 lock (resultList)
                 {
                     resultList.Add(result);
                 }
             });

            while (true)
            {
                if (resultList.Count == 1000)
                {
                    var end = DateTime.Now;

                    foreach (var item in resultList)
                    {
                        Console.WriteLine("Thread Id: " + item.ThreadId);
                        Console.WriteLine("Send Request: " + item.SendRequest.ToString());
                        Console.WriteLine("Response Time: " + (item.GetResponse - item.SendRequest).ToString());
                        Console.WriteLine("Value: " + item.Value);
                        Console.WriteLine("----------------------------------------------------");
                    }

                    var duration = end - start;
                    Console.WriteLine("Total duration: " +duration.ToString());
                    Console.ReadKey();
                    break;
                }
            }
        }

اگه اجرا کنید برنامه رو و لاگ ها رو تو کنسول مشاهده کنید متوجه میشید که تمامی Thread ها در همون لحظه ی درخواست Http رو صادر کردن اما در پاسخ به این درخواست انگار که بلاک شدن و تشکیل صف دادن و زمان پاسخ دهی هر Thread بعد از Thread قبلی پاسخ گرفته هست!!!

همه ی Thread ها در این خط بلاک میشن و تشکیل صف میدن : (ارسال درخواست به سرور که اگه این خط نباشه هیچ Thread بلاک نمیشه)

var response = await client.GetStringAsync("api/get");

مدلی هم که برای مشاهده نتایج ارسال و دریافت پاسخ هستش :

    public class Result
    {
        public string ThreadId { get; set; }
        public DateTime SendRequest { get; set; }
        public DateTime GetResponse { get; set; }
        public string Value { get; set; }
    }

خب باید عرض کنم که هیچ کانفیگی اعمال نشده و کد سرور داره روی IIS Express ویژوآل استادیو اجرا میشه

لطفا کمک کنید یک هفته اس درگیر این قضیه ام

موندم چرا اینا بلاک میشن و به هم جوین میخورن، مشکل از کجاست، سرور! کلاینت! کجا...

ممنون

۱۰۰۰ درخواست همزمان فرستادم که اول و آخرش رو براتون میذارم

کدها رو هم براتون ارسال میکنم اگه خواستین خودتون تست کنید

با تشکر

پاسخ های این پرسش

تعداد پاسخ ها : 0 پاسخ
در حال حاضر هیچ پاسخی ارسال نشده است
کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)