.NET ফ্রেমওয়ার্ক 4.5-এ System.Net.Http.HttpClient এবং System.Net.Http.HttpClientHandler 4.5 আইডিস্পোজেবল প্রয়োগ করে ( System.Net.Http.HttpMessageInvoker এর মাধ্যমে )।
using
বিবৃতি ডকুমেন্টেশন বলেছেন:
একটি নিয়ম হিসাবে, আপনি যখন একটি আইডিজিপোজেবল অবজেক্ট ব্যবহার করেন, আপনি এটি ব্যবহারের বিবৃতিতে এটি ঘোষণা এবং তাত্ক্ষণিক করা উচিত।
এই উত্তরটি এই প্যাটার্নটি ব্যবহার করে:
var baseAddress = new Uri("http://example.com");
var cookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
{
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("foo", "bar"),
new KeyValuePair<string, string>("baz", "bazinga"),
});
cookieContainer.Add(baseAddress, new Cookie("CookieName", "cookie_value"));
var result = client.PostAsync("/test", content).Result;
result.EnsureSuccessStatusCode();
}
তবে মাইক্রোসফ্টের সর্বাধিক দৃশ্যমান উদাহরণগুলি Dispose()
স্পষ্টভাবে বা স্পষ্টভাবে কল করে না । এই ক্ষেত্রে:
- মূল ব্লগ নিবন্ধ HttpClient এর relase ঘোষণা।
- HttpClient এর জন্য প্রকৃত এমএসডিএন ডকুমেন্টেশন ।
- BingTranslateSample
- GoogleMapsSample
- WorldBankSample
ইন ঘোষণার মন্তব্যে গুলি, কেউ জিজ্ঞাসা মাইক্রোসফট কর্মচারী:
আপনার নমুনাগুলি যাচাই করার পরে, আমি দেখেছি আপনি এইচটিপিপিপ্লায়েন্টের দৃষ্টান্তে ডিসপোজ অ্যাকশনটি সম্পাদন করেন নি। আমি আমার অ্যাপ্লিকেশনটিতে বিবৃতি ব্যবহার করে এইচটিটিপিপ্লিনেন্টের সমস্ত দৃষ্টান্ত ব্যবহার করেছি এবং আমি ভেবেছিলাম যে এটি সঠিক পন্থা হ'ল এইচটিটিপিপ্লায়েন্ট আইডিসপোজেবল ইন্টারফেস প্রয়োগ করে। আমি কি সঠিক পথে আছি?
তার উত্তর ছিল:
সাধারণভাবে এটি সঠিক যদিও আপনাকে "ব্যবহার" এবং অ্যাসিঙ্কের সাথে সতর্কতা অবলম্বন করতে হবে কারণ তারা সত্যই মিশ্রিত করে না et নেট 4, নেট .৫ আপনি "ব্যবহার করে" বিবৃতিতে "অপেক্ষার" ব্যবহার করতে পারেন।
বিটিডব্লিউ, আপনি একইভাবে এইচটিটিপিপ্লিনেন্টটিকে পুনরায় ব্যবহার করতে পারেন যতবার আপনার পছন্দ হয় [যতক্ষণ] সাধারণত আপনি সর্বদা সেগুলি তৈরি / নিষ্পত্তি করবেন না।
দ্বিতীয় অনুচ্ছেদটি এই প্রশ্নের জন্য অতিরিক্ত প্রয়োজন, যা আপনি এইচটিপিপিপ্লায়েন্ট উদাহরণটি কতবার ব্যবহার করতে পারবেন তা নিয়ে উদ্বিগ্ন নয়, তবে আপনার আর প্রয়োজনের পরে এটি নিষ্পত্তি করার প্রয়োজন আছে কিনা তা নিয়ে নয়।
(আপডেট: বাস্তবে দ্বিতীয় অনুচ্ছেদটি উত্তরের মূল চাবিকাঠি, যা নীচে @ ডিডেডেন সরবরাহ করেছেন))
সুতরাং আমার প্রশ্নগুলি হ'ল:
এইচটিপিপিপ্লিয়েন্ট এবং এইচটিপিপিপ্লায়েন্টহ্যান্ডলার উদাহরণগুলিতে ডিসপোজ () কল করার জন্য বর্তমান বাস্তবায়ন (.NET ফ্রেমওয়ার্ক 4.5।) দেওয়া কি প্রয়োজনীয়? স্পষ্টকরণ: "প্রয়োজনীয়" দ্বারা আমি বোঝাতে চাইছি যদি নিষ্পত্তি না করার জন্য কোনও নেতিবাচক পরিণতি হয় যেমন রিসোর্স ফাঁস বা ডেটা দুর্নীতির ঝুঁকি।
যদি এটি অপরিহার্য না হয়, তবে এটি কীভাবেই "ভাল অনুশীলন" হবে, যেহেতু তারা অদৃশ্যকরণ কার্যকর করে?
যদি এটি প্রয়োজনীয় (বা প্রস্তাবিত) হয় তবে উপরে বর্ণিত এই কোডটি নিরাপদে এটি কার্যকর করা হয়েছে (। নেট ফ্রেমওয়ার্ক 4.5 এর জন্য)?
যদি এই ক্লাসগুলিকে ডিসপোজ () কল করার প্রয়োজন না হয় তবে এগুলি আইডিজিপোজযোগ্য হিসাবে কেন প্রয়োগ করা হয়েছিল?
যদি তাদের প্রয়োজন হয়, বা এটি একটি প্রস্তাবিত অনুশীলন হয়, তবে মাইক্রোসফ্টের উদাহরণগুলি কি বিভ্রান্তিমূলক বা নিরাপদ নয়?
Flush
প্রতিটি লেখার পরে একটিতে কল করতে পারেন এবং অন্যটির অসুবিধা ব্যতীত অন্তর্নিহিত সংস্থানগুলি প্রয়োজনের চেয়ে বেশি সময় ধরে ধরে রাখা উচিত, "সঠিক আচরণ" এর জন্য প্রয়োজনীয় এমনটি কী ঘটবে না?