با سلام
کنترلر ساده ی زیر رو در نظر بگیرید
[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 ویژوآل استادیو اجرا میشه
لطفا کمک کنید یک هفته اس درگیر این قضیه ام
موندم چرا اینا بلاک میشن و به هم جوین میخورن، مشکل از کجاست، سرور! کلاینت! کجا...
ممنون
۱۰۰۰ درخواست همزمان فرستادم که اول و آخرش رو براتون میذارم
کدها رو هم براتون ارسال میکنم اگه خواستین خودتون تست کنید
با تشکر
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)