PDA

View Full Version : حرفه ای: ساختن کاربر جدید در Identity



سعید کشاورز
پنج شنبه 02 آذر 1396, 20:35 عصر
سلام دوستان.
یه سوال داشتم.
زمانی که از خود پروژه mvc به صورت پیش فرض استفاده میشه یه کنترلر Account داریم که اکشن Register اون به صورت Async نوشته شده.








[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);


// For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771
// Send an email with this link
// string code = await UserManager.GenerateEmailConfirmationTokenAsync(us er.Id);
// var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
// await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");


return RedirectToAction("Index", "Home");
}
AddErrors(result);

}


// If we got this far, something failed, redisplay form
return View(model);
}




حالا اگه از حالت Async استفاده نشه چه مشکلاتی میتونه پیش بیاد؟
اگه توی یک مثال عملی این مورد رو توضیح بدین ممنون میشم

Moien Tajik
پنج شنبه 02 آذر 1396, 23:15 عصر
بدون استفاده از Async هم هیچ مشکلی پیش نمیاد.
استفاده از async باعث میشه بعنوان مثال عملیات ثبت نام کاربر داخل یک Thread دیگه فارغ از Main Thread انجام بشه که باعث میشه برنامتون منتظر تموم شدن ثبت نام کاربر نمونه و UI برنامه که در Main Thread هست block بشه.

این پاسخ کامل به این سوال هست : https://stackoverflow.com/a/19087592/6661314

hakim22
جمعه 03 آذر 1396, 12:29 عصر
وقتی شما از Async استفاده می کنید یک Thread جدید برای انجام عملیات ایجاد میشه که میتونه موازی با Thread اصلی پروژه کار کنه.
در مواقعی که عملیات زمانبره و مربوط به سرور دیگه ای میشه (مثل وب سرویسها خارجی) یا مربوط به نرم افزار دیگه ای میشه (مثل تبدیل فایل به pdf) یا در بخش دیگری از سیستم عامل مدیریت میشه
(مثل ایجاد فایل) بهتره از Async استفاده کنید. عدم استفاده از Async در ترافیک بالا میتونه باعث کندی بیش از حد سایت بشه و همه ی کاربرهارو آزار بده. اما در ترافیک پایین عملا مشکلی ایجاد نمیکنه.

بهش مثل یک ایستگاه قطار نگاه کنید. اگر فقط یک ریل داشته باشیم قطارها باید یکی یکی بارگیری و تخلیه بشن. ولی معمولا چند خط موازی وجود دارن که قطارها بتونن همزمان بیان و برن.

نکته اینکه تعداد محدودی Thread داریم و اینطور نیست که بشه به هر تعداد لازم از اونها ساخت و موازی کردن همیشه بهترین راه نیست.
و دیگر اینکه اگر عملیات موازی سازی شده درون یک سرور داره انجام هرچند باعث استفاده ی حد اکثری از منابع سیستم میشه اما کمک زیادی به بالا رفتن سرعت نمیکنه.
کار اصلی که انجام میده جدا کردن عملیات UI از سیستم هست که از هنگ کردن ظاهری سایت یا نرم افزار جلوگیری میکنه.
بهترین حالت زمانی هست که عملیات در سرور یا رایانه ی دیگری انجام بشه.

سعید کشاورز
شنبه 04 آذر 1396, 09:37 صبح
عدم استفاده از Async در ترافیک بالا میتونه باعث کندی بیش از حد سایت بشه و همه ی کاربرهارو آزار بده. اما در ترافیک پایین عملا مشکلی ایجاد نمیکنه.

یعنی اگر روال ثبت نام کاربر ما فقط در حد ذخیره در دیتابیس باشه نه بیشتر.مثلا ایمیل نفرستیم،اس ام اس ارسال نشه، نیازی به Async نیست.درسته؟



نکته اینکه تعداد محدودی Thread داریم و اینطور نیست که بشه به هر تعداد لازم از اونها ساخت و موازی کردن همیشه بهترین راه نیست.
تعداد تردها چقدر هست؟ آیا بستگی به هاست داره و یا اینکه خود برنامه تعداد تردهاش محدود هست؟



کار اصلی که انجام میده جدا کردن عملیات UI از سیستم هست که از هنگ کردن ظاهری سایت یا نرم افزار جلوگیری میکنه.

اینکه گفته میشه ui نرم افزار هنگ میکنه ، مگه توی وب سایت هم ui هنگ میکنه؟ منظورت از هنگ کردن مدت زمان زیادی هست که کاربر منتظر پاسخ میمونه؟
چون هنگ کردن رو توی برنامه های ویندوز فرم دیدم که فرم قفل میشه تا اون عملیات انجام بشه.

hakim22
شنبه 04 آذر 1396, 11:06 صبح
یعنی اگر روال ثبت نام کاربر ما فقط در حد ذخیره در دیتابیس باشه نه بیشتر.مثلا ایمیل نفرستیم،اس ام اس ارسال نشه، نیازی به Async نیست.درسته؟

به ظاهر نیاز نیست ولی در Identity به علت اینکه از دیتابیس استفاده میکنه و کار با دیتابیس در مقایسه با سایر عملیاتها کنده کل سیستم Identity از Async استفاده میکنه. در نسخه ی جدید Identity فقط امکان استفاده از Async وجود داره.



تعداد تردها چقدر هست؟ آیا بستگی به هاست داره و یا اینکه خود برنامه تعداد تردهاش محدود هست؟
بستگی به سرور و حجم درخواستها داره. اما از نظر تعداد به طور پیشفرض 12 و تا حداکثر 5000 تا قابل افزایشه. می توانید در Web.Config تنظیم کنید. اما بالا بردن عدد لزوما باعث بالا رفتن بازدهی سایت نمیشه. ممکنه باعث کندی هم بشه.



اینکه گفته میشه ui نرم افزار هنگ میکنه ، مگه توی وب سایت هم ui هنگ میکنه؟ منظورت از هنگ کردن مدت زمان زیادی هست که کاربر منتظر پاسخ میمونه؟
چون هنگ کردن رو توی برنامه های ویندوز فرم دیدم که فرم قفل میشه تا اون عملیات انجام بشه.

در IIS تعداد محدودی از Thread ها برای پاسخ گویی به درخواستهای Http در نظر گرفته میشه. اگه هیچ Thread در دسترس نباشه درخواستهای جدید باید منتظر پایان درخواستهای قبلی باشن (وضعیتی که در مرورگر با چرخش دایره کنار تب نشون داده میشه) که به معنی قفل شدن UI یا همون مرورگره. اگر زمان انتظار از یک حدی بیشتر بشه معمولا خطای 500 برگردونده میشه. در واقع تعداد درخواست از و حجم اونها از توان سیستم سر ریز میکنه و سرور دیگه قادر به پاسخگویی نیست.