আমার কি () ডেটাসেট এবং ডেটা টেবিল নিষ্পত্তি করা উচিত?


197

ডেটাসেট এবং ডেটা টেবিল উভয়ই আইডিস্পোজেবল বাস্তবায়ন করে, তাই প্রচলিত সেরা অনুশীলনগুলির দ্বারা আমার তাদের ডিসপোজ () পদ্ধতিগুলি কল করা উচিত।

যাইহোক, আমি এ পর্যন্ত যা পড়েছি তা থেকে, ডেটাসেট এবং ডেটা টেবিলের আসলে কোনও ব্যবস্থাবিহীন সংস্থান নেই, তাই ডিসপোজ () আসলে খুব বেশি কিছু করে না।

এছাড়াও, আমি কেবল ব্যবহার করতে পারি না using(DataSet myDataSet...)কারণ ডেটাসেটে ডেটা টেবিলগুলির সংকলন রয়েছে।

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

সুতরাং, আমার সমস্ত ডেটাসেট এবং ডেটা টেবিলগুলিতে ডিসপোজ () কল করা ঝামেলা কি উপযুক্ত?

সংযোজন:

আপনারা যারা মনে করেন যে ডেটাসেটটি নিষ্পত্তি করা উচিত: সাধারণভাবে, নিষ্পত্তি করার প্যাটার্নটি হ'ল usingবা try..finally, কারণ আপনি গ্যারান্টি দিতে চান যে ডিসপোজ () ডাকা হবে।

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

অথবা, আপনি কি পরামর্শ দিচ্ছেন যে আমি কেবল মাইডাটাসেট.ডিসপোজ () কল করি এবং মাইডাটাসেট.টিবেলে ডেটা টেবিলগুলি ডিসপোজ করার কথা ভুলে যাই?


9
নিষ্পত্তি কোনও ব্যতিক্রম ছোঁড়ার কথা নয়। যদি এটি করে - এটি ভাল লেখা নেই, সুতরাং… চেষ্টা করুন। কিছু বলুন (); } ক্যাচ {enough যথেষ্ট হওয়া উচিত। - ব্লগস.এমএসএন
বি

3
আমি আমার অ্যাপ্লিকেশনগুলির একটিতে একটি আপাত মেমরি ফাঁস লক্ষ্য করেছি যা প্রচুর ডেটাসেট অবজেক্ট ব্যবহার করে। আমি কল করছিলাম না। ডিসপোজ () বা এই বিষয়গুলির জন্য "ব্যবহার" ব্লক ব্যবহার করে। সুতরাং, আমি কোডটি দিয়ে গিয়েছিলাম এবং যেখানেই আমি ডেটাসেট বা ডেটা টেবিল তৈরি করেছিলাম সেখানে প্রতিটি জায়গায় "ব্যবহার" ব্লক যুক্ত করেছি এবং ভয়েলা স্মৃতি এখন প্রকাশিত হয়েছে। আমার কাছে একটি শক্ত ইঙ্গিত মনে হয়েছে যে .Dispose () আসলে ডেটাসেট এবং ডেটা টেবিলের জন্য প্রয়োজনীয়।
dizzy.stackoverflow

উত্তর:


147

ডেটাসেটের জন্য কেন নিষ্পত্তি করা জরুরি নয় তা ব্যাখ্যা করে এখানে বেশ কয়েকটি আলোচনা করা হচ্ছে।

নিষ্পত্তি বা না নিষ্পত্তি করতে? :

ডেটাসেটে ডিসপোজ পদ্ধতি কেবলমাত্র উত্তরাধিকারের পার্শ্ব প্রতিক্রিয়ার কারণে বিদ্যমান - অন্য কথায়, এটি চূড়ান্তকরণে আসলে কার্যকর কিছু করে না।

ডেটাবেল এবং ডেটাসেট অবজেক্টগুলিতে ডিসপোজ কল করা উচিত? একটি এমভিপি থেকে কিছু ব্যাখ্যা অন্তর্ভুক্ত:

System.data নেমস্পেস (ADONET) এ পরিচালনা না করা সংস্থান নেই। অতএব যতক্ষণ না আপনি নিজেকে এতে বিশেষ কিছু যুক্ত করেন না ততক্ষণ তাদের কাউকে নিষ্পত্তি করার দরকার নেই।

নিষ্পত্তি পদ্ধতি এবং ডেটাসেটগুলি বোঝাচ্ছেন? কর্তৃপক্ষের স্কট অ্যালেনের মন্তব্য সহ একটি মন্তব্য রয়েছে:

প্রাইসিসে আমরা খুব কমই একটি ডেটাসেট ডিসপোজ করি কারণ এটি সামান্য উপকারের প্রস্তাব দেয় "

সুতরাং, the ক্যমত্যটি হ'ল বর্তমানে কোনও ডেটাসেটে ডিসপোজ কল করার কোনও ভাল কারণ নেই।


7
প্রদত্ত লিঙ্কগুলি বিন্দুটি পুরোপুরি মিস করেছে যে ডেটাটেবল একধরণের ফাইনালাইজেবল অবজেক্ট। নীচে নারিমন এর উত্তর দেখুন।
হারমান

আকর্ষণীয় উত্তর তবে স্কেল সংযোগ, স্কেলকম্যান্ড এবং স্কেলডেটা অ্যাডাপ্টার সম্পর্কে কী, ডিসপোজকে স্পষ্টভাবে বলা উচিত?
উইলি

@ উইলি আমি মনে করি প্রচুর লোক আইডিসপোজেবলগুলির জন্য একটি ব্যবহারের বিবৃতি ব্যবহার করে। (এসকিউএল সংযোগ সিএন = নতুন এসকিএলসিঙ্কশন (কানেকশনস্ট্রিং)) ব্যবহার করে S (এসকিউএলকম্যান্ড সেমি = নতুন স্কেলকম্যান্ড (কমান্ডস্ট্রিং, সিএন)) n সিএন.ওপেন (); cm.ExecuteNonQuery (); }}
ডক

1
@ উইল হ্যাঁ এগুলি একেবারে নিষ্পত্তি করা উচিত কারণ তারা নিয়ন্ত্রণহীন সংস্থান ব্যবহার করে। এটি usingব্লক ব্যবহার করে স্পষ্টভাবে বা স্পষ্টভাবে বলা হোক না কেন এটি আপনার উপর নির্ভর করে ।
ডি স্ট্যানলে

129

আপডেট (ডিসেম্বর 1, 2009):

আমি এই উত্তরটি সংশোধন করে স্বীকার করতে চাই যে মূল উত্তরটি ত্রুটিযুক্ত ছিল।

মূল বিশ্লেষণ করে যে বস্তু চূড়ান্ত প্রয়োজন প্রয়োগ - এবং পয়েন্ট যে চর্চা একটি সঠিক, ইন গভীরতার বুঝতে এখনও ঘোরা ছাড়া পৃষ্ঠের উপর স্বীকার করা উচিত।

তবে, দেখা যাচ্ছে যে ডেটাসেটস, ডেটাভিউস, ডেটা টেবিলগুলি তাদের নির্মাতাদের চূড়ান্তকরণ দমন করে - এই কারণেই তাদের উপর ডিসপোজ () কল করা সুস্পষ্টভাবে কিছুই করে না।

সম্ভবতঃ এগুলি ঘটে কারণ তাদের নিয়ন্ত্রণহীন সংস্থান নেই; সুতরাং মার্শালবাইভ্যালিউ কম্পোনেন্টটি নিয়ন্ত্রিত সংস্থাগুলির জন্য ভাতা দেয় এ সত্ত্বেও , এই বিশেষ বাস্তবায়নগুলির প্রয়োজন হয় না এবং তাই চূড়ান্তকরণ এড়াতে পারে।

(এটি। নেট লেখকরা সাধারণত যে ধরণের সাধারণত সবচেয়ে বেশি স্মৃতি দখল করে থাকেন তার চূড়ান্তকরণকে দমন করার বিষয়ে যত্ন নেবেন চূড়ান্ত আকারে সাধারণভাবে এই অনুশীলনের গুরুত্বকে বোঝায়))

তা সত্ত্বেও, এই বিশদগুলি এখনও .NET ফ্রেমওয়ার্ক (প্রায় 8 বছর আগে) প্রতিষ্ঠার পর থেকে আন্ডার-ডকুমেন্টেড হয়েছে বিস্ময়কর (আপনি মূলত আপনার নিজের ডিভাইসগুলিকে বিবাদযুক্ত যদিও চালিত করার জন্য রেখে গেছেন, টুকরো টুকরোটি একসাথে রাখার জন্য সময়ে সময়ে হতাশাব্যঞ্জক হয় তবে আমরা প্রতিদিনের উপর নির্ভর করে কাঠামোর আরও সম্পূর্ণ বোঝাপড়া সরবরাহ করি)।

প্রচুর পড়ার পরে, আমার বোঝার বিষয়টি এখানে:

একটি বস্তু চূড়ান্ত প্রয়োজন হলে পারে মেমরির আর ব্যাপৃত তুলনায় এটি এর প্রয়োজন - এখানে কেন: ক) কোনো প্রকার করে একটি বিনাশকারী বা যে ধরনের সংজ্ঞায়িত করে তা একটা বিনাশকারী) finalizable বিবেচনা করা হয় থেকে সংজ্ঞায়িত (উত্তরাধিকারী; খ) বরাদ্দকরণে (কনস্ট্রাক্টর চলার আগে), চূড়ান্তকরণের সারিতে একটি পয়েন্টার স্থাপন করা হয়; গ) একটি চূড়ান্তযোগ্য অবজেক্টের সাধারণত 2 সংগ্রহ সংগ্রহ করতে হয় (মান 1 এর পরিবর্তে); ঘ) চূড়ান্তকরণকে দমন করা চূড়ান্তকরণের সারি থেকে কোনও বস্তু সরিয়ে দেয় না (এসওএসে FinalizeQueue হিসাবে রিপোর্ট করা হয়েছে) এই আদেশটি বিভ্রান্তিকর; চূড়ান্তকরণের সারিতে কী কী জিনিস রয়েছে তা জেনে রাখা (নিজেই এবং এর মধ্যে) সহায়ক নয়; চূড়ান্তকরণের সারিতে কী কী জিনিস রয়েছে এবং এখনও চূড়ান্তকরণের প্রয়োজন তা জেনে রাখা সহায়ক হবে (এর জন্য কোনও আদেশ আছে কি?)

চূড়ান্তকরণকে দমন করা অবজেক্টের শিরোনামটিতে রানটাইমের ইঙ্গিত দেয় যে এটির ফাইনালাইজারটি চাওয়ার দরকার নেই (FReachable সারিটি সরানোর দরকার নেই) ইঙ্গিত করে; এটি চূড়ান্তকরণের সারিতে রয়ে গেছে (এবং এসওএসে FinalizeQueue এর দ্বারা রিপোর্ট করা অবিরত)

ডেটা টেবিল, ডেটাসেট, ডেটাভিউ ক্লাসগুলি সমস্তই মার্শালবাইভ্যাল্প কম্পোনেন্টে মূলযুক্ত, এটি একটি চূড়ান্তযোগ্য অবজেক্ট যা (সম্ভাব্য) অনিয়ন্ত্রিত সংস্থানগুলি পরিচালনা করতে পারে

  • যেহেতু ডেটা টেবিল, ডেটাসেট, ডেটাভিউ অপরিকল্পিত সংস্থানসমূহ প্রবর্তন করে না, তারা তাদের নির্মাণকারীগুলিতে চূড়ান্তকরণ দমন করে
  • যদিও এটি একটি অস্বাভাবিক নিদর্শন, এটি কল করার পরে ব্যবহারের পরে ডিসপোজ কল করার বিষয়ে চিন্তাভাবনা থেকে মুক্তি দেয়
  • এটি এবং এই তথ্যটি যে সম্ভাব্যভাবে বিভিন্ন ডেটাসেটগুলিতে ডেটা টেবিলগুলি ভাগ করা যায়, সম্ভবত ডেটাসেটগুলি শিশু ডেটা টেবিলগুলি নিষ্পত্তি করতে পাত্তা দেয় না is
  • এর অর্থ হ'ল এই বিষয়গুলি SOS- এ FinalizeQueue এর অধীন প্রদর্শিত হবে
  • যাইহোক, এই অবজেক্টগুলি তাদের অ-চূড়ান্ত অযোগ্য অংশগুলির মতো একক সংগ্রহের পরেও পুনরুদ্ধারযোগ্য হওয়া উচিত

4 (নতুন তথ্যসূত্র):

আসল উত্তর:

এ সম্পর্কে প্রচুর বিভ্রান্তিমূলক এবং সাধারণত খুব দুর্বল উত্তর রয়েছে - যে কেউ এখানে অবতরণ করেছে তাদের আওয়াজ উপেক্ষা করা উচিত এবং নীচের উল্লেখগুলি সাবধানতার সাথে পড়তে হবে।

কোনও সন্দেহ ছাড়াই, যেকোন চূড়ান্তকরণযোগ্য অবজেক্টের জন্য নিষ্পত্তি করা উচিত

DataTables হয় Finalizable।

কল করা ডিসপোজ উল্লেখযোগ্যভাবে মেমরি পুনরুদ্ধার গতি।

মার্শালবাইভ্যালিউ কম্পোনেন্টটি তার ডিসপোজ ()জিসি.সপ্রেসফাইনালাইজকে (এটি) কল করে - এড়িয়ে যাওয়া মানে স্মৃতি পুনরুদ্ধারের আগে কয়েকশো জেন0 সংগ্রহ না হলে কয়েক ডজন অপেক্ষা করতে হবে:

চূড়ান্তকরণের এই প্রাথমিক বোঝার সাথে আমরা ইতিমধ্যে কয়েকটি খুব গুরুত্বপূর্ণ বিষয়টি কমাতে পারি:

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

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

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

জেন 2-তে রেফারেন্সযুক্ত ডেটা টেবিলগুলির 100s এমবি দেখতে পাওয়া এমন ব্যক্তির কাছ থেকে এটি নিন: এটি অত্যন্ত গুরুত্বপূর্ণ এবং এই থ্রেডের উত্তরগুলি থেকে পুরোপুরি মিস হয়েছে।

তথ্যসূত্র:

1 - http://msdn.microsoft.com/en-us/library/ms973837.aspx

2 - http://vineetgapt.spaces.live.com/blog/cns!8DE4BDC896BEE1AD !1104.entry http://www.dotnetfunda.com/articles/article524-net-best-p ੈਕਟ-no- 2 - mprove - garbage -collector ক্ষমতা সম্পন্ন-ব্যবহার-finalizedispose-pattern.aspx

3 - http://codeidol.com/csharp/net-framework/Inside-the-CLR/ স্বয়ংক্রিয়- স্মৃতি- পরিচালন /


ভাল যুক্তি. যখন আপনার অনেকগুলি ডাটাবেলযুক্ত ডেটাসেট থাকে আপনি সাধারণত আপনার কোডটি কীভাবে গঠন করেন? বিবৃতি ব্যবহার করে নেস্ট টন? একবারে একবারে সব পরিষ্কার করার চেষ্টা করুন?
এমবিকেশ

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

ধন্যবাদ। এই আলোচনাটি কি একই সাথে প্রযোজ্য TableAdapter?
বন্ডোলিন


24

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


ভবিষ্যতে এটি আইডিজিপোজেবল বাস্তবায়ন করবে এমন কোনও গ্যারান্টি নেই। এটি যদি আপনার (...) ব্যবহারের মতো সহজ ছিল তবে আমি আপনার সাথে একমত হব, তবে ডেটাসেটের ক্ষেত্রে এটি কিছুতেই ঝামেলার মতো মনে হচ্ছে like
এমবিকেশিশ

28
এটি মোটামুটি নিরাপদ এটি ধরে রাখতে যে এটি সর্বদা আইডিজিপোজেবল বাস্তবায়ন করবে। ইন্টারফেস যুক্ত করা বা অপসারণ একটি ব্রেকিং পরিবর্তন, যেখানে ডিসপোজ প্রয়োগের পরিবর্তন হয় না।
গ্রেগ ডিন

5
এছাড়াও, অন্য কোনও সরবরাহকারীর এমন একটি বাস্তবায়ন থাকতে পারে যা বাস্তবে আইডিসপোজেবলের সাথে কিছু করে।
ম্যাট স্প্রেডলি

DataTableএটি সিল করা হয়নি তা উল্লেখ করার জন্য নয় - আপনি যখন করছেন তখন কোনও বড় বিষয় নয় new DataTable, তবে DataTableযুক্তি হিসাবে বা কোনও পদ্ধতির কল হিসাবে কোনও সিদ্ধান্ত নেওয়ার সময় এটি বেশ গুরুত্বপূর্ণ ।
লুয়ান

17

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

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

protected virtual void Dispose(bool disposing)
{
    if (disposing)
    {
        lock (this)
        {
            if ((this.site != null) && (this.site.Container != null))
            {
                this.site.Container.Remove(this);
            }
            if (this.events != null)
            {
                EventHandler handler = (EventHandler) this.events[EventDisposed];
                if (handler != null)
                {
                    handler(this, EventArgs.Empty);
                }
            }
        }
    }
}

1
প্রকৃতপক্ষে. আমি সম্প্রতি কিছু কোড দেখেছি যেখানে নিষ্পত্তি না করে প্রচুর পরিমাণে ডেটা টেবিল তৈরি করা হয়েছিল large এটি কম্পিউটারে সমস্ত মেমরি গ্রাস করা এবং স্মৃতিশক্তি শেষ না হওয়ায় প্রক্রিয়া ক্র্যাশ হয়ে যায়। বিকাশকারীকে ডেটা টেবেলে ডিসপোজ কল করতে বলার পরে সমস্যাটি চলে গেল।
রিচার্ডড

7

আপনি কি ডেটা টেবিলগুলি নিজে তৈরি করেন? কারণ যে কোনও অবজেক্টের (ডেটাসেট. টেবিলগুলিতে) শিশুদের মধ্য দিয়ে পুনরাবৃত্তি করা সাধারণত প্রয়োজন হয় না, কারণ এটি সমস্ত সন্তানের সদস্যদের নিষ্পত্তি করা পিতামাতার কাজ।

সাধারণত, নিয়মটি হ'ল: আপনি যদি এটি তৈরি করেন এবং এটি আইডিজपोস কার্যকর করে তবে তা নিষ্পত্তি করুন। আপনি যদি এটি তৈরি না করে থাকেন তবে তা নিষ্পত্তি করবেন না, এটি প্যারেন্ট অবজেক্টের কাজ। তবে প্রতিটি বস্তুর বিশেষ নিয়ম থাকতে পারে, ডকুমেন্টেশন পরীক্ষা করুন।

.NET 3.5 এর জন্য, এটি স্পষ্টভাবে বলেছে "আর ব্যবহার না করার সময় এটি নিষ্পত্তি করুন", তাই আমি যা করব।


4
আমি যা বুঝতে পারি তা থেকে সাধারণ sensকমত্যটি হল যে কোনও বস্তুর নিজস্ব পরিচালনাবিহীন সংস্থানগুলি নিষ্পত্তি করা উচিত। যাইহোক, IDisposable একটি সংগ্রহ বস্তু তার উপাদানের মাধ্যমে সাধারণ বারবার প্রতিটি এক মীমাংসা করা হবে না, কারণ সেখানে সংগ্রহে বাইরে তার উপাদান অন্য রেফারেন্স হতে পারে: stackoverflow.com/questions/496722/...
mbeckish

1
সত্য, সংগ্রহগুলি সর্বদা আমি বিশেষ বলে মনে করি কারণ এগুলি সাধারণত "কিছুই করা হয় না", সেগুলি কেবল ... ধারক, সুতরাং আমি কখনই সে সম্পর্কে মাথা ঘামাই না।
মাইকেল Stum

7

আমি যেকোন সময় অবলম্বন কল করি যখন কোনও অবজেক্ট আইডিজিপোজযোগ্য প্রয়োগ করে। এটি একটি কারণ আছে।

ডেটাসেটগুলি বিশাল মেমরি হোগ হতে পারে। যত তাড়াতাড়ি এগুলি পরিষ্কার করার জন্য চিহ্নিত করা যায় তত ভাল।

হালনাগাদ

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


5
কল নিষ্পত্তি কল মেমরির পুনরুদ্ধার করতে গতি দেয় না, এটি করার জন্য আপনাকে ময়লা নিজেই জঞ্জাল সংগ্রহকারীকে শুরু করতে হবে যা সাধারণত একটি খারাপ পরিকল্পনা।
টেটেরুনট্রন

2
নিষ্পত্তি যদি শূন্যতার জন্য একগুচ্ছ রেফারেন্স সেট করে তবে এটি সংগ্রহের পক্ষে অবজেক্টগুলিকে প্রার্থী হতে পারে যা অন্যথায় বাদ যায়।
গ্রেগ ডিন

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

4
প্রাথমিক IDisposable ব্যবহার অপরিচালিত সম্পদ মুক্তি হয়। প্রায়শই সময় এটি একটি পদ্ধতিতে রাষ্ট্রকেও পরিবর্তন করে যা কোনও নিষ্পত্তিযোগ্য উদাহরণের জন্য অর্থবোধ করে। (উদাহরণস্বরূপ, সম্পত্তিগুলিকে মিথ্যাতে সেট করা হয়েছে, উল্লেখগুলি বাতিল হয়ে যাবে, ইত্যাদি)
গ্রেগ ডিন ২

3
যদি কোনও জিনিসে নিষ্পত্তি করার পদ্ধতি থাকে তবে তা কোনও কারণ ছাড়াই এটি সেখানে রাখা হয়েছিল যদি তা পরিচালনা না করা অবজেক্টগুলি পরিষ্কার করার জন্য হয়।
চক কনওয়ে

4

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

আমি সত্যিই এসও লোকেদের ভোট দেওয়ার জন্য জবাবটি চাপিয়ে দেওয়ার জন্য উত্তরটি নিচে নাম দেওয়ার আগে একটি মন্তব্য লিখতে বাধ্য করি।


+ 1 আমি অনুমান করি কিছু লোক অন্যদের বিভিন্ন দৃষ্টিভঙ্গি বিবেচনা করার অনুমতি দিতে চান না।
ডোক

2
ডাউন ভোটিং, কোনওভাবেই লোককে বিভিন্ন দৃষ্টিকোণ বিবেচনা করতে অস্বীকার করে না।
গ্রেগ ডিন

1

ডেটাসেটগুলি IDisposable পুঙ্খানুপুঙ্খ মার্শালবাইভ্যালিউ কম্পোনেন্ট বাস্তবায়ন করে, যা আইডিস্পোজেবল কার্যকর করে। যেহেতু ডেটাসেট পরিচালনা করা হয় কল করার জন্য কল করার কোনও আসল সুবিধা নেই।


6
এটি এখন হতে পারে, পরে এটি কী করবে কে জানে।
গ্রেগ ডিন

এই মনোভাব যেখানে আপনি অনুমান করছেন যে কোনও কোড ভবিষ্যতে এটি করবে না বলে মনে করবে না যা জড়িতদের অনুমানের ব্যথা।
মাইক্রোসার্ভেসিঅনডিডিডি

0

ক্লিয়ার () ফাংশনটি ব্যবহার করার চেষ্টা করুন। এটি নিষ্পত্তি করার জন্য আমার পক্ষে দুর্দান্ত কাজ করে।

DataTable dt = GetDataSchema();
//populate dt, do whatever...
dt.Clear();

0

ডিসপোজ করার দরকার নেই () কারণ ডেটাসেট মার্শালবাইভ্যালু কম্পোনেন্ট শ্রেণীর উত্তরাধিকারী এবং মার্শালওয়াইভ্যালু কম্পোনেন্টটি আইডিসপোজেবল ইন্টারফেস প্রয়োগ করে

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