ইভেন্ট হ্যান্ডলাররা কি আবর্জনা সংগ্রহ বন্ধ করে দেয়?


183

আমার যদি নিম্নলিখিত কোড থাকে:

MyClass pClass = new MyClass();
pClass.MyEvent += MyFunction;
pClass = null;

পিস ক্লাস কি জঞ্জাল সংগ্রহ করা হবে? বা এটি যখনই ঘটবে তখনও এর ঘটনাগুলি গুলি চালিয়ে দেবে? আবর্জনা সংগ্রহের অনুমতি দেওয়ার জন্য আমার কি নিম্নলিখিতগুলি করা দরকার?

MyClass pClass = new MyClass();
pClass.MyEvent += MyFunction;
pClass.MyEvent -= MyFunction;
pClass = null;

11
আমি এই প্রশ্নে আগ্রহী পাঠকদের উদ্দেশ্যে অস্থায়ীভাবে পরামর্শ দিতে যাচ্ছি যে এটি হালকা ওজনের ঘটনা / দুর্বল ইভেন্ট নিদর্শনগুলির সাথে পরিচিত হওয়া সার্থক হতে পারে, যা আবর্জনা সংগ্রহকে আটকাবে না। এই বিষয়ে একটি ভাল তাই বুটস্ট্র্যাপ হয় stackoverflow.com/questions/185931/...
fostandy

20
উত্তরসূরির জন্য দ্রষ্টব্য: নালকে রেফারেন্স সেট করা কেবলমাত্র রেফারেন্সের ক্ষেত্রটিকে এক লাইন বাড়িয়ে আবর্জনা সংগ্রহকারীকে বিলম্বিত করে। .NET ভিবি 6 নয়।
জন স্যান্ডার্স

উত্তর:


207

সুনির্দিষ্ট প্রশ্নের জন্য "উইল পিস ক্লাস আবর্জনা সংগ্রহ করা হবে": ইভেন্টের সাবস্ক্রিপশনটির পিস ক্লাস সংগ্রহের উপর কোনও প্রভাব নেই (প্রকাশক হিসাবে)।

জিসির জন্য সাধারণভাবে (বিশেষত, লক্ষ্য): এটি মাই ফাংশন স্থির বা উদাহরণ ভিত্তিক কিনা তা নির্ভর করে।

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

মনে রাখবেন যে এটি একমুখী; অর্থাত্ যদি আমাদের থাকে:

publisher.SomeEvent += target.SomeHandler;

তারপরে "প্রকাশক" "লক্ষ্য "টিকে জীবিত রাখবে, তবে" লক্ষ্য "" প্রকাশক "কে জীবিত রাখবে না।

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

স্থির ইভেন্টগুলি, এই কারণে, উদাহরণস্বরূপ হ্যান্ডলারের সাথে ব্যবহার করার সময় অত্যন্ত বিপজ্জনক।


6
ঠিক আছে, যদি প্রশ্নটি "পিস ক্লাসটি আবর্জনা সংগ্রহ করা হবে" হয়, তবে উত্তরটি "এটি নির্ভর করে ..." আসলে সঠিক নয় কিনা। এটি কোনও কিছুর উপর নির্ভর করে না, কারণ মার্ক নিজেই আরও নীচে লিখেছেন।
টর হগেন

@ টোর - যথেষ্ট ন্যায্য - আমি স্পষ্ট করব
মার্ক গ্র্যাভেল

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

একটি মহান উত্তর কারণ এর পাশাপাশি এ প্রশ্নও (যে জিজ্ঞাসা করা হয়েছিল) অপরার্ধ ঠিকানা: প্রকাশক বন্ধ হবে গ্রাহক GC'd হওয়া থেকে।
বব সমারস

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

9

হ্যাঁ, pClass আবর্জনা সংগ্রহ করা হবে। ইভেন্ট সাবস্ক্রিপশনটি বোঝায় না যে কোনও রেফারেন্স পিস ক্লাসে বিদ্যমান।

সুতরাং না, পিস ক্লাসের আবর্জনা সংগ্রহের জন্য আপনাকে হ্যান্ডলারটি আলাদা করতে হবে না।


8

যে মুহুর্তে কোনও মেমরির উল্লেখ করা হয় না তা আবর্জনা সংগ্রহের প্রার্থী হয়ে ওঠে। যখন আপনার শ্রেণীর উদাহরণটি সুযোগের বাইরে চলে যায়, এটি আর আপনার প্রোগ্রাম দ্বারা উল্লেখ করা হয় না। এটি আর ব্যবহার করা হয় না এবং তাই নিরাপদে সংগ্রহ করা যায়।

যদি আপনি নিশ্চিত না হন যে অন্য কিছু সংগ্রহ করা হবে তখন নিজেকে নীচের প্রশ্নটি জিজ্ঞাসা করুন: এরপরে কি এখনও কোনও উল্লেখ রয়েছে? ইভেন্ট হ্যান্ডলারগুলি অন্য কোনও উপায়ে নয়, অবজেক্টের উদাহরণ দ্বারা রেফারেন্স করা হয়।


0

pClassআবর্জনা সংগ্রহ করা হবে। তবে উপরের কোড স্নিপেটটি যদি অন্য শ্রেণীর মধ্যে থাকে তবে আপনি সেট না করা থাকলে class শ্রেণীর উদাহরণটি পরিষ্কার নাও হতে pClassপারে null

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