আমি পার্টিতে দেরি করেছি, তবে এই কৌশলটি নিয়ে আমার শেখার যাত্রা এখানে।
১. এইচটিপিপিলেটকে পুনরায় ব্যবহার করার ক্ষেত্রে আমরা সরকারী আইনজীবী কোথায় পাব?
আমি বোঝাতে চাইছি, যদি এইচটিপিপ্লিয়েন্টকে পুনরায় ব্যবহারের উদ্দেশ্য হয়
এবং তা করা গুরুত্বপূর্ণ হয় তবে এ জাতীয় উকিলগুলি তার নিজস্ব এপিআই ডকুমেন্টেশনে আরও বেশি "অ্যাডভান্সড টপিকস", "পারফরম্যান্স (অ্যান্টি) প্যাটার্ন" বা অন্য ব্লগ পোস্টগুলিতে লুকিয়ে থাকা থেকে নথিভুক্ত থাকে is । নইলে নতুন শিক্ষার্থী খুব দেরী হওয়ার আগে এটি জানার কথা কীভাবে?
এখন অবধি (মে 2018), গুগল করার সময় প্রথম অনুসন্ধান ফলাফল এমএসডিএন-তে এই এপিআই রেফারেন্স পৃষ্ঠাটিতে নির্দেশ করে , যা এই উদ্দেশ্যটির মোটেও উল্লেখ করে না। ঠিক আছে, নবাগতদের জন্য এখানে পাঠ 1 টি হ'ল এমএসডিএন সহায়তা পৃষ্ঠার শিরোনামের ঠিক পরে "অন্যান্য সংস্করণ" লিঙ্কটি ক্লিক করুন, আপনি সম্ভবত "বর্তমান সংস্করণ" এর লিঙ্কগুলি খুঁজে পাবেন। এই এইচটিটিপিপ্লায়েন্টের ক্ষেত্রে, এটি আপনাকে সেই উদ্দেশ্যে উদ্দেশ্যটির বিবরণ সহ এখানে সর্বশেষ নথিতে নিয়ে আসবে
।
আমার সন্দেহ হয় যে অনেক বিকাশকারী যারা এই বিষয়টিতে নতুন ছিলেন তারা সঠিক ডকুমেন্টেশন পৃষ্ঠাটিও খুঁজে পাননি, এ কারণেই এই জ্ঞানটি ব্যাপকভাবে ছড়িয়ে যায় না, এবং লোকেরা যখন পরে এটি খুঁজে পেল তখন
সম্ভবত তারা খুব কঠিনভাবে আবিষ্কার করেছিল ।
2. (ভুল?) ধারণা using
IDisposable
এই এক সামান্য প্রসঙ্গ-বহির্ভূত কিন্তু এখনও যে ইশারা, এটা অনুযোগ কিভাবে এই উপরোক্ত ব্লগ পোস্ট ব্যক্তিদের দেখতে একটি কাকতালীয় নয় সাধ্যমতো HttpClient
'র IDisposable
ইন্টারফেস তোলে তাদের ব্যবহারের প্রবণতা using (var client = new HttpClient()) {...}
প্যাটার্ন এবং তারপর সমস্যা হতে।
আমি বিশ্বাস করি যে অব্যক্ত (ভুল?) ধারণার অবতারণা হয়েছে :
"একটি আইডিস্পোজযোগ্য অবজেক্টটি স্বল্পস্থায়ী হওয়ার আশা করা যায়" ।
যাইহোক, যখন আমরা এই স্টাইলে কোড লিখি তখন এটি অবশ্যই একটি স্বল্প-কালীন জিনিসের মতো লাগে:
using (var foo = new SomeDisposableObject())
{
...
}
IDisposable অফিসিয়াল ডকুমেন্টেশন
কখনো উল্লেখ IDisposable
বস্তু স্বল্পস্থায়ী হতে হবে। সংজ্ঞা অনুসারে, আইডিস্পোজেবল কেবল আপনাকে নিয়ন্ত্রণহীন সংস্থানগুলি ছাড়ার অনুমতি দেওয়ার একটি ব্যবস্থা। বেশি কিছু না. সেই অর্থে, অবশেষে নিষ্পত্তিটি ট্রিগার করতে আপনি ব্যর্থ, তবে স্বল্প-কালীন ফ্যাশনে এটি করার প্রয়োজন হয় না।
অতএব আপনার বাস্তব বস্তুর জীবনচক্রের প্রয়োজনীয়তার ভিত্তিতে নিষ্পত্তি কখন ট্রিগার করতে হবে তা সঠিকভাবে চয়ন করা আপনার কাজ। আপনাকে দীর্ঘায়িত উপায়ে আইডিস্পোসেবল ব্যবহার করা থেকে বিরত করার কিছুই নেই:
using System;
namespace HelloWorld
{
class Hello
{
static void Main()
{
Console.WriteLine("Hello World!");
using (var client = new HttpClient())
{
for (...) { ... } // A really long loop
// Or you may even somehow start a daemon here
}
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
}
এই নতুন বোঝাপড়ার সাথে, এখন আমরা সেই ব্লগ পোস্টটিতে পুনরায় ঘুরে দেখি , আমরা স্পষ্টভাবে লক্ষ্য করতে পারি যে "ফিক্স" HttpClient
একবারে আরম্ভ করে তবে কখনও তা নিষ্পত্তি করে না, এজন্য আমরা এর নেটস্যাট আউটপুট থেকে দেখতে পাচ্ছি যে সংযোগটি ESTABLISHED অবস্থায় রয়েছে যার অর্থ এটি রয়েছে সঠিকভাবে বন্ধ করা হয়নি। যদি এটি বন্ধ করা হয়, তবে তার রাজ্যটি পরিবর্তে TIME_WAIT এ থাকবে। বাস্তবে, আপনার পুরো প্রোগ্রামটি শেষ হওয়ার পরে কেবল একটি সংযোগ খোলা বড় কথা নয় এবং ব্লগ পোস্টার এখনও ঠিক করার পরে একটি পারফরম্যান্স লাভ দেখতে পাবে; তবে তবুও, আইডিস্পোজেবলকে দোষ দেওয়া এবং এটি নিষ্পত্তি না করা চয়ন করা ধারণাগতভাবে ভুল।
৩. আমাদের কি এইচটিপিপ্লিয়েন্টকে একটি স্থিতিশীল সম্পত্তিতে রাখতে হবে, বা এমনকি এটি সিঙ্গলটন হিসাবে রাখতে হবে?
পূর্ববর্তী বিভাগের বোঝার ভিত্তিতে, আমি মনে করি যে এখানে উত্তরটি পরিষ্কার হয়ে যায়: "অগত্যা নয়"। এটি আপনি কীভাবে আপনার কোডটি সংগঠিত করেন তার উপর নির্ভর করে যতক্ষণ আপনি কোনও HTTPClient এবং পুনরায় ব্যবহার করবেন না (আদর্শভাবে) অবশেষে এটি নিষ্পত্তি করবেন।
হাসিখুশিভাবে, বর্তমান সরকারী দস্তাবেজের মন্তব্য বিভাগেও উদাহরণটি
যথাযথভাবে এটি সঠিকভাবে করে না। এটি একটি "গুডকন্ট্রোলার" শ্রেণি সংজ্ঞায়িত করে, যেখানে একটি স্থির এইচটিটিপি ক্লিনেন্ট সম্পত্তি থাকে যা নিষ্পত্তি হবে না; যা উদাহরণ বিভাগের আর একটি উদাহরণ
জোর দিয়েছিল তা অমান্য করে : "ডিসপোজ কল করতে হবে ... সুতরাং অ্যাপ্লিকেশন সংস্থান ফাঁস করে না"।
এবং সবশেষে, সিঙ্গলটন এর নিজস্ব চ্যালেঞ্জ ছাড়া নয়।
"কতজন লোক বিশ্বব্যাপী পরিবর্তনশীলকে একটি ভাল ধারণা বলে মনে করেন? কেউ নেই।
কতজন লোক মনে করেন সিঙ্গলটন একটি ভাল ধারণা? কয়েকটি।
কি দেয়? সিঙ্গলেটগুলি গ্লোবাল ভেরিয়েবলগুলির একগুচ্ছ ""
- এই অনুপ্রেরণামূলক বক্তৃতা থেকে উদ্ধৃত, "গ্লোবাল স্টেট এবং সিঙ্গললেটস"
পিএস: স্কেল সংযোগ
এটি এখনকার প্রশ্নোত্তরের সাথে অপ্রাসঙ্গিক, তবে এটি সম্ভবত জানা-জানা। স্কেল সংযোগ ব্যবহারের ধরণটি আলাদা। আপনি SqlConnection পুনরায় ব্যবহার করার জন্য প্রয়োজন হবে না কারণ এটির সংযোগ পুল ভাল যে ভাবে হ্যান্ডেল করবে।
পার্থক্যটি তাদের বাস্তবায়নের পদ্ধতির কারণে ঘটে। প্রতিটি এইচটিপিপিপ্লায়েন্টের নিজস্ব সংযোগ পুল ব্যবহার করা হয় ( এখান থেকে উদ্ধৃত
); কিন্তু SqlConnection নিজেই একটি কেন্দ্রীয় সংযোগ পুল দ্বারা পরিচালিত হয়, অনুযায়ী এই ।
এবং আপনাকে এখনও স্কেল সংযোগটি নিষ্পত্তি করতে হবে, যেমন আপনি এইচটিপিপ্লিয়েন্টের জন্য করা উচিত।