এমভিসি 5 এর সাথে অ্যাসিঙ্ক ব্যবহারের সুবিধা কী?


120

পার্থক্য কি:

public ActionResult Login(LoginViewModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        IdentityResult result = IdentityManager.Authentication.CheckPasswordAndSignIn(AuthenticationManager, model.UserName, model.Password, model.RememberMe);
        if (result.Success)
        {
            return Redirect("~/home");
        }
        else
        {
            AddErrors(result);
        }
    }
    return View(model);
}

এবং:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        IdentityResult result = await IdentityManager.Authentication.CheckPasswordAndSignInAsync(AuthenticationManager, model.UserName, model.Password, model.RememberMe);
        if (result.Success)
        {
            return Redirect("~/home");
        }
        else
        {
            AddErrors(result);
        }
    }
    return View(model);
}

আমি দেখতে পাচ্ছি যে এমভিসি কোডটিতে এখন অ্যাসিঙ্ক রয়েছে তবে পার্থক্য কী। একজন কি অন্যের চেয়ে অনেক বেশি ভালো পারফরম্যান্স দেয়? একে অপরের তুলনায় সমস্যার ডিবাগ করা কি সহজ? আমার অ্যাপ্লিকেশনটির জন্য অ্যাসিঙ্ক যুক্ত করার জন্য আমার কি অন্যান্য নিয়ন্ত্রকদের পরিবর্তন করা উচিত?


বেশিরভাগ পরিস্থিতিতে
এমভিসিতে অ্যাসিঙ্ক

1
@ ক্রিসমারিসিক - সবচেয়ে গুরুতর একটি: আপনি রিডার রাইটারলক বা অন্য কোনও সিঙ্ক্রোনাইজেশন আদিম ব্যবহার করতে পারবেন না (সেমাফোরের বাদে)।
Quarkly

উত্তর:


170

আপনি যখন দূরবর্তী সার্ভার কলগুলির মতো আই / ও বাউন্ড অপারেশন করছেন তখনই অ্যাসিঙ্ক ক্রিয়াগুলি কার্যকর। অ্যাসিঙ্ক কলের সুবিধা হ'ল আই / ও অপারেশন চলাকালীন কোনও এএসপি.এনইটি কর্মী থ্রেড ব্যবহার করা হচ্ছে না। সুতরাং এখানে প্রথম উদাহরণটি কীভাবে কাজ করে তা এখানে:

  1. যখন কোনও অনুরোধটি ক্রিয়াটিকে আঘাত করে, তখন এএসপি.এনইট থ্রেড পুল থেকে একটি থ্রেড নেয় এবং তা কার্যকর করতে শুরু করে।
  2. IdentityManager.Authentication.CheckPasswordAndSignInপদ্ধতি প্রার্থনা করা হয়। এটি একটি ব্লকিং কল -> পুরো কল চলাকালীন কর্মীর থ্রেডটি বিপন্ন হচ্ছে।

এবং দ্বিতীয় কলটি কীভাবে কাজ করে তা এখানে:

  1. যখন কোনও অনুরোধটি ক্রিয়াটিকে আঘাত করে, তখন এএসপি.এনইট থ্রেড পুল থেকে একটি থ্রেড নেয় এবং তা কার্যকর করতে শুরু করে।
  2. IdentityManager.Authentication.CheckPasswordAndSignInAsyncবলা হয় যা অবিলম্বে ফেরৎ। একটি আই / ও সমাপ্তি পোর্ট নিবন্ধভুক্ত এবং এএসপি.এনইটি কর্মী থ্রেড থ্রেড পুলে প্রকাশিত হয়।
  3. পরে যখন অপারেশন সমাপ্ত হয়, আই / ও কমপ্লিট পোর্টটি সিগন্যাল করা হয়, দর্শনটি ফিরে আসা শেষ করতে থ্রেড পুল থেকে অন্য থ্রেড আঁকা হয়।

যেমন আপনি দ্বিতীয় ক্ষেত্রে দেখতে পাচ্ছেন এএসপি.এনইটি কর্মী থ্রেডগুলি কেবল অল্প সময়ের জন্য ব্যবহৃত হয়। এর অর্থ হ'ল অন্য অনুরোধগুলি সরবরাহ করার জন্য পুলটিতে আরও থ্রেড উপলব্ধ।

সুতরাং উপসংহারে, কেবলমাত্র যখন আপনার অভ্যন্তরে সত্যিকারের async এপিআই থাকে তখনই অ্যাসিঙ্ক ক্রিয়াগুলি ব্যবহার করুন। যদি আপনি কোনও অ্যাসিঙ্ক ক্রিয়াকলাপের ভিতরে কোনও ব্লকিং কল করেন, আপনি এর পুরো সুবিধাটি হারাচ্ছেন।


কনটেক্সট সিঙ্ক্রোনাইজেশন সম্পর্কে কীভাবে। এটি কি এমন ওভারহেড হবে না যে আপনি মোটে অ্যাসিঙ্ক ক্রিয়া ব্যবহার করতে চান না? "একটি অ্যাসিঙ্ক পদ্ধতির ওভারহেড যা প্রকৃতপক্ষে অবিচ্ছিন্নভাবে সম্পাদন করে এটি সম্পূর্ণরূপে সিঙ্ক্রোনাইজেশন কনটেক্সট.পস্ট ব্যবহার করে থ্রেড পরিবর্তন করতে হবে কিনা তার উপর সম্পূর্ণ নির্ভর করে it যদি এটি হয় তবে ওভারহেডটি থ্রেড সুইচটির দ্বারা পুনরায় শুরু হওয়ার সাথে সাথে এটি সম্পাদন করে। যার অর্থ বর্তমান সিঙ্ক্রোনাইজেশন কনটেক্সট তৈরি করে একটি বড় পার্থক্য। " (সি # 5.0, 2012 এ
অ্যাসিঙ্ক

1
@ ডারিন কেন মূল থ্রেড প্রকাশ করা এত গুরুত্বপূর্ণ? থ্রেড কি সীমাবদ্ধ?
ওমতেচগুই

1
@ ওমতেচগুয়ে একটি আরও ভাল সমাধান হ'ল নন এএসপি.নেট অনুরোধগুলি সিডিএন-এ স্থানান্তর করা। একটি সাধারণ সিডিএন কেবল আপনার জাভাস্ক্রিপ্ট এবং চিত্রগুলির মতো শারীরিক ফাইলের জন্য সাবডোমেন এবং পৃথক অ্যাপ পুল ব্যবহার করছে। বিকল্পভাবে আপনি ফাইলগুলির জন্য নিজিনএক্স / লাইটটিপিডি / অ্যাপাচি ব্যবহার করতে পারেন, বা আপনি আকামাই (সিডিএন এর রাজা তবে সবচেয়ে ব্যয়বহুল) এর মতো কোনও তৃতীয় পক্ষের পরিষেবা ব্যবহার করতে পারেন
ক্রিস মেরিসিক

আমি এখনও বিভ্রান্ত যখন CheckPasswordAndSignInAsyncডাকা হয়, ASP.NET থ্রেড পুল থেকে অন্য থ্রেড নেয় এবং এটি কার্যকর করতে শুরু করে, তাই না? যদি তা না হয় তবে কোথায় checking password procedureমৃত্যুদন্ড কার্যকর করা হবে?
কেভিনবুই

2

সাধারণত, কোনও একক এইচটিটিপি অনুরোধটি একটি একক থ্রেড দ্বারা পরিচালনা করা হবে, সাড়া না দেওয়া পর্যন্ত পুল থেকে সেই থ্রেডটি পুরোপুরি সরিয়ে ফেলবে। টিপিএল দিয়ে আপনি এই সীমাবদ্ধতার দ্বারা আবদ্ধ নন। যে কোনও অনুরোধ আসে তা পুলের যে কোনও থ্রেডে এক্সিকিউট করতে সক্ষম প্রতিক্রিয়া গণনা করার জন্য গণনের প্রতিটি ইউনিটের সাথে একটি ধারাবাহিকতা শুরু করে। এই মডেলটির সাহায্যে আপনি স্ট্যান্ডার্ড এএসপি.নেটের চেয়ে আরও অনেকগুলি সমবর্তী অনুরোধগুলি পরিচালনা করতে পারেন।

যদি এটি কোনও নতুন কাজ হয় যা স্প্যান করা হবে, বা না, এবং যদি এটি অপেক্ষা করা উচিত বা না হয়। সর্বদা প্রায় 70০ এমএস সম্পর্কে চিন্তা করুন। সর্বাধিক যে কোনও পদ্ধতি কল গ্রহণ করা উচিত time যদি এটি দীর্ঘ হয় তবে আপনার ইউআই সম্ভবত খুব বেশি প্রতিক্রিয়া বোধ করবে না।


0

ওয়েব অ্যাপ্লিকেশনগুলিতে যেগুলি প্রারম্ভকালে প্রচুর সংখ্যক সাম্প্রতিক অনুরোধগুলি দেখতে পায় বা একটি প্রস্ফুটিত লোড থাকে (যেখানে একযোগে ক্রমবর্ধমান বৃদ্ধি পায়), এই ওয়েব পরিষেবা কলগুলিকে অ্যাসিঙ্ক্রোনাস করা আপনার আবেদনের সাড়া জাগিয়ে তুলবে। একটি সিঙ্ক্রোনাস অনুরোধ হিসাবে প্রক্রিয়া করতে একটি অ্যাসিঙ্ক্রোনাস অনুরোধ একই পরিমাণ সময় নেয়। উদাহরণস্বরূপ, যদি কোনও অনুরোধ যদি কোনও ওয়েব পরিষেবা কল করে যা সম্পূর্ণ করতে দুই সেকেন্ডের প্রয়োজন হয়, তবে অনুরোধটি এটি দুটি সিঙ্ক্রোনালি বা অ্যাসিক্রোনারিকভাবে সম্পাদিত হয় কিনা তা সেকেন্ডে লাগে। যাইহোক, অ্যাসিক্রোনাস কল চলাকালীন, প্রথম অনুরোধটি শেষ হওয়ার অপেক্ষায় থ্রেডটিকে অন্য অনুরোধগুলির প্রতিক্রিয়া জানাতে বাধা দেওয়া হয় না। অতএব, অ্যাসিনক্রোনাস অনুরোধগুলি দীর্ঘমেয়াদী ক্রিয়াকলাপকে অনুরোধ করে এমন অনেকগুলি সমবর্তী অনুরোধ রয়েছে যখন অনুরোধ সারি এবং থ্রেড পুল বৃদ্ধি রোধ করে।


যদি আপনার অ্যাসনেট অ্যাপ্লিকেশনটিতে মূলত অন্যান্য ওয়েব সার্ভারগুলিতে কল থাকে তবে আপনি মূলত একটি 'গেটওয়ে' / 'প্রক্সি' হিসাবে আচরণ করছেন এবং সেই লক্ষ্যে অ্যাসিঙ্ক কার্যকর।
ক্রিস মেরিসিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.