এএসপি এমভিসি: আইকন্ট্রোলার ডিসপোজ () কখন বলা হয়?


83

আমি আমার বৃহত্তর এমভিসি অ্যাপ্লিকেশনগুলির একটিতে বড় রিফ্যাক্টরিং / স্পিড টুইট করছি। এটি এখন কয়েক মাস ধরে প্রোডাক্টে মোতায়েন করা হয়েছে এবং আমি সংযোগ পুলে সংযোগের অপেক্ষায় টাইমআউট পেতে শুরু করেছি। সংযোগগুলি সঠিকভাবে নিষ্পত্তি না হওয়ার বিষয়ে আমি বিষয়টি ট্র্যাক করেছি।

এর আলোকে, আমি তখন থেকে আমার বেস নিয়ামকটিতে এই পরিবর্তনটি করেছি:

public class MyBaseController : Controller
{
    private ConfigurationManager configManager;  // Manages the data context.

    public MyBaseController()
    {
         configManager = new ConfigurationManager();
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (this.configManager != null)
            {
                this.configManager.Dispose();
                this.configManager = null;
            }
        }

        base.Dispose(disposing);
    }
}

এখন, আমার দুটি প্রশ্ন রয়েছে:

  1. আমি কি কোনও রেসের শর্ত প্রবর্তন করছি? যেহেতু এটি configManagerপরিচালনাগুলিতে দেখা যায় DataContextযা IQueryable<>প্যারামিটারগুলি প্রকাশ করে, তাই আমার নিশ্চিত করা দরকার যে Dispose()ভিউ রেন্ডারিং শেষ হওয়ার আগে নিয়ামককে কল করা হবে না।
  2. এমভিসি ফ্রেমওয়ার্কটি Dispose()ভিউ রেন্ডার হওয়ার আগে বা পরে কন্ট্রোলারে কল করে? অথবা, এমভিসি কাঠামো কি তা আবর্জনা সংগ্রহে ছেড়ে যায়?

4
আমি এই উত্তরটির অপেক্ষায় রয়েছি! দুর্দান্ত প্রশ্ন!
ড্যানিয়েল ইলিয়ট

অন্যান্য কোড (আপনার বা এএসপি.এনইটি এমভিসি এর ..) না দেখে আপনার কেন কনফিগার ম্যানেজারটি বাতিল করতে হবে? এটি কিছু সাহায্য করে? আপনারা আমাকে "
ডিইউএইচ

আমি বলতে চাইছি একটি সাধারণ ক্ষেত্রে এটির মতো একটি জাতি শর্ত সহজেই সরানো যায়। এই বিশেষ ক্ষেত্রে আমি সন্দেহ করি যে একটি নিয়ামক উদাহরণটি একাধিক থ্রেড দ্বারা ব্যবহৃত হবে এবং তাই কোনও জাতি শর্তের ঝুঁকি নেই।
আন্দ্রে রেনিয়া

4
@ আন্দ্রেই: এটি সামান্য কিছুটা ডিফেন্সিভ কোডিং। যদি আমার নিষ্পত্তি পদ্ধতিতে দু'বার কল করা হয় তবে এটি আমাকে দুবার ডেটাবেস সংযোগ নিষ্পত্তি করতে বাধা দেয়।
জন গীটজেন

4
@ আন্ড্রেই: ঠিক আছে, আমার মতে "উপেক্ষা করা" এবং "শিশু বিষয়গুলিতে যাইহোক কলিং ডিসপোজ" পুরোপুরি আলাদা। অতএব চেক।
জন গীটজেন

উত্তর:


70

সবসময় ভিউ রেন্ডার করার পরে ডিসপোজ বলা হয় ।

কলটি কলটিতে দৃশ্যটি রেন্ডার করা হয়েছে ActionResult.ExecuteResult। এটিকে বলা হয় (পরোক্ষভাবে) দ্বারা ControllerActionInvoker.InvokeAction, যা ঘুরে ফিরে বলা হয় ControllerBase.ExecuteCore

যেহেতু নিয়ন্ত্রণটি কল স্ট্যাকের মধ্যে রয়েছে যখন ভিউটি রেন্ডার করা হয়, তখন তা নিষ্পত্তি করা যায় না।


দুর্দান্ত, আপনার কি ডকুমেন্টেশন আছে? আমি ঠিক নিশ্চিত হতে চান।
জন গিয়েজেন

দুর্দান্ত! এটি ব্যাখ্যা করার জন্য একটি ডক পাওয়া খুব ভাল লাগবে। তবে বর্ধিত উত্তরটি সত্যিই সান্ত্বনাজনক ছিল। কোড সব থেকে ভাল ডক। : ডি
সিএসএ

37

স্রেফ ক্রেগ স্টান্টজের উত্তরটি প্রসারিত করতে :

কন্ট্রোলার ফ্যাক্টরি পরিচালনা করে যখন কোনও নিয়ামককে নিষ্পত্তি করা হয়। আইসিএনট্রোলারফ্যাক্টরি ইন্টারফেসটি প্রয়োগ করার সময়, প্রয়োগ করা দরকার এমন একটি পদ্ধতি হ'ল রিলিজকন্ট্রোলার।

আপনি নিজের রোলড কি না আপনি কন্ট্রোলার ফ্যাক্টরিটি কী ব্যবহার করছেন তা আমি নিশ্চিত নই, তবে ডিফল্টকন্ট্রোলারফ্যাক্টরিটির দিকে চেয়ে রিফ্লেক্টরে রিলিজকন্ট্রোলার পদ্ধতিটি এভাবে প্রয়োগ করা হয়েছে:

public virtual void ReleaseController(IController controller)
{
    IDisposable disposable = controller as IDisposable;
    if (disposable != null)
    {
        disposable.Dispose();
    }
}

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

রিলিজকন্ট্রোলার পদ্ধতিটি System.Web.Mvc.MvcHandler দ্বারা ডাকা হয় যা অনুরোধটি পরিচালনা করে এবং এটি IHttpHandler প্রয়োগ করে। প্রসেসরউয়েস্ট এটি প্রদত্ত এইচটিটিপি কনটেক্সট নেয় এবং প্রয়োগকৃত কন্ট্রোলার ফ্যাক্টরিতে ফোন করে অনুরোধটি পরিচালনা করতে নিয়ামক সন্ধানের প্রক্রিয়া শুরু করে। আপনি যদি প্রসেসরুয়েস্ট পদ্ধতিটি দেখেন তবে আপনি অবশেষে ব্লকটি দেখতে পাবেন যা কন্ট্রোলার ফ্যাক্টরির রিলিজকন্ট্রোলারকে ডাকে। এটি তখনই ডাকা হয় যখন কন্ট্রোলার একটি ভিউরসাল্ট ফিরিয়ে দেয়।


দুর্দান্ত উত্তর। আমি বুঝতে পারি না যে কোনও কন্ট্রোলার অবজেক্টের সরাসরি উদাহরণ আমাকে কেন এটিতে ডিসপোজ () কল করতে দেয় না, তবে দেখে মনে হচ্ছে এটি আইডিস্পোজযোগ্য ইন্টারফেস ব্যবহার করে এটির একটি নতুন উদাহরণ তৈরি করা দরকার। এটি আমার পক্ষে কাজ করেছিল!
মেগা ম্যাট

তো ... HttpContextপুরুষ কি? এখন আমি সত্যিই বিভ্রান্ত।
শেফ_কোড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.