এইচটিটিপিপ্লায়েন্ট এবং এইচটিটিপিপ্লায়েন্টহ্যান্ডলারকে কি অনুরোধগুলির মধ্যে নিষ্পত্তি করতে হবে?


334

.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()স্পষ্টভাবে বা স্পষ্টভাবে কল করে না । এই ক্ষেত্রে:

ইন ঘোষণার মন্তব্যে গুলি, কেউ জিজ্ঞাসা মাইক্রোসফট কর্মচারী:

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

তার উত্তর ছিল:

সাধারণভাবে এটি সঠিক যদিও আপনাকে "ব্যবহার" এবং অ্যাসিঙ্কের সাথে সতর্কতা অবলম্বন করতে হবে কারণ তারা সত্যই মিশ্রিত করে না et নেট 4, নেট .৫ আপনি "ব্যবহার করে" বিবৃতিতে "অপেক্ষার" ব্যবহার করতে পারেন।

বিটিডব্লিউ, আপনি একইভাবে এইচটিটিপিপ্লিনেন্টটিকে পুনরায় ব্যবহার করতে পারেন যতবার আপনার পছন্দ হয় [যতক্ষণ] সাধারণত আপনি সর্বদা সেগুলি তৈরি / নিষ্পত্তি করবেন না।

দ্বিতীয় অনুচ্ছেদটি এই প্রশ্নের জন্য অতিরিক্ত প্রয়োজন, যা আপনি এইচটিপিপিপ্লায়েন্ট উদাহরণটি কতবার ব্যবহার করতে পারবেন তা নিয়ে উদ্বিগ্ন নয়, তবে আপনার আর প্রয়োজনের পরে এটি নিষ্পত্তি করার প্রয়োজন আছে কিনা তা নিয়ে নয়।

(আপডেট: বাস্তবে দ্বিতীয় অনুচ্ছেদটি উত্তরের মূল চাবিকাঠি, যা নীচে @ ডিডেডেন সরবরাহ করেছেন))

সুতরাং আমার প্রশ্নগুলি হ'ল:

  1. এইচটিপিপিপ্লিয়েন্ট এবং এইচটিপিপিপ্লায়েন্টহ্যান্ডলার উদাহরণগুলিতে ডিসপোজ () কল করার জন্য বর্তমান বাস্তবায়ন (.NET ফ্রেমওয়ার্ক 4.5।) দেওয়া কি প্রয়োজনীয়? স্পষ্টকরণ: "প্রয়োজনীয়" দ্বারা আমি বোঝাতে চাইছি যদি নিষ্পত্তি না করার জন্য কোনও নেতিবাচক পরিণতি হয় যেমন রিসোর্স ফাঁস বা ডেটা দুর্নীতির ঝুঁকি।

  2. যদি এটি অপরিহার্য না হয়, তবে এটি কীভাবেই "ভাল অনুশীলন" হবে, যেহেতু তারা অদৃশ্যকরণ কার্যকর করে?

  3. যদি এটি প্রয়োজনীয় (বা প্রস্তাবিত) হয় তবে উপরে বর্ণিত এই কোডটি নিরাপদে এটি কার্যকর করা হয়েছে (। নেট ফ্রেমওয়ার্ক 4.5 এর জন্য)?

  4. যদি এই ক্লাসগুলিকে ডিসপোজ () কল করার প্রয়োজন না হয় তবে এগুলি আইডিজিপোজযোগ্য হিসাবে কেন প্রয়োগ করা হয়েছিল?

  5. যদি তাদের প্রয়োজন হয়, বা এটি একটি প্রস্তাবিত অনুশীলন হয়, তবে মাইক্রোসফ্টের উদাহরণগুলি কি বিভ্রান্তিমূলক বা নিরাপদ নয়?


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

9
@ দামিয়েন_ও_ অবিশ্বাসী: সত্য নয়। বিশেষত, সঠিক আচরণের জন্য স্ট্রিম লেখকদের অবশ্যই নিষ্পত্তি করতে হবে।
স্টিফেন ক্লিয়ারি

1
@ স্টেফেনক্রিয়ারি - আপনি কোন দিকগুলি সম্পর্কে ভাবছেন? অবশ্যই, আপনি Flushপ্রতিটি লেখার পরে একটিতে কল করতে পারেন এবং অন্যটির অসুবিধা ব্যতীত অন্তর্নিহিত সংস্থানগুলি প্রয়োজনের চেয়ে বেশি সময় ধরে ধরে রাখা উচিত, "সঠিক আচরণ" এর জন্য প্রয়োজনীয় এমনটি কী ঘটবে না?
ড্যামিয়েন_এ_বিশ্বাসীরা

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

1
আমি তাদের ডক্স আপডেট করার জন্য মাইক্রোসফ্টকে একটি PR জমা দিয়েছি: github.com/dotnet/docs/pull/2470
চিহ্নম্নল

উত্তর:


259

সাধারণ sensক্যমত্য হ'ল আপনাকে HTTPClient নিষ্পত্তি করার দরকার নেই (হওয়া উচিত নয়)।

ঘনিষ্ঠভাবে এটি যেভাবে কাজ করে তাতে জড়িত অনেক লোক এটি জানিয়েছে।

দেখুন Darrel মিলারের ব্লগ পোস্ট এবং সংশ্লিষ্ট তাই পোস্ট: মেমরি লিক মধ্যে HttpClient হামাগুড়ি দিয়া ফলাফল রেফারেন্সের জন্য।

আমি দৃ strongly়ভাবে পরামর্শ দিয়েছি যে আপনি হুডের অধীনে কী চলছে, বিশেষত এখানে উদ্ধৃত "লাইফসাইকেল" বিভাগটি প্রসঙ্গে এইএসপি.এনইটের সাথে বিবর্তনযোগ্য ওয়েব এপিআই ডিজাইন করা থেকে এইচটিটিপি ক্লিনেন্ট অধ্যায়টি পড়ুন :

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

অথবা ডটপিক খুলুন।


64
আপনার উত্তরটি স্পষ্ট করার জন্য, এটি কি সঠিক হবে যে "আপনি যদি এই লেটারটি পুনঃস্থাপনের জন্য ইনস্টলস অবধি ধরে থাকেন তবে আপনাকে এইচটিপিপ্লিনেন্টকে নিষ্পত্তি করার দরকার নেই"? উদাহরণস্বরূপ, যদি কোনও পদ্ধতিকে বারবার বলা হয় এবং একটি নতুন এইচটিপিপিপ্লায়েন্ট ইনস্ট্যান্স তৈরি করা হয় (যদিও এটি বেশিরভাগ ক্ষেত্রে এটি প্রস্তাবিত প্যাটার্ন নয়) তবে এই পদ্ধতিটি উদাহরণটি নিষ্পত্তি না করা উচিত কি বলে সঠিক হবে (যা পুনরায় ব্যবহার করা হবে না)? এটি হাজারো নির্বিঘ্ন দৃষ্টান্তগুলিতে নিয়ে যেতে পারে। অন্য কথায়, আপনার চেষ্টা করা উচিত এবং দৃষ্টান্তগুলি পুনরায় ব্যবহার করা উচিত, তবে আপনি যদি পুনরায় ব্যবহার না করেন, তবে আপনি সেগুলি আরও ভালভাবে নিষ্পত্তি করতে চান (সংযোগগুলি প্রকাশ করার জন্য)?
ফার্নান্দো কোরিয়া

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

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

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

19
@ ডেভিডপেডেন একটি সিঙ্গলটন হিসাবে এইচটিপিপিপ্লিয়েন্ট নিবন্ধন করা আমার পক্ষে বিপজ্জনক বলে মনে হচ্ছে কারণ এটি পরিবর্তনযোগ্য। উদাহরণস্বরূপ, Timeoutসম্পত্তি অর্পণ করা প্রত্যেকে কি একে অপরের উপর stomping হবে না ?
জন-এরিক

47

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

  1. সাধারণত যখন আপনি তাদের সাথে কাজ করেন সাধারণত বেশিরভাগ IDisposableবস্তু আদর্শভাবে নিষ্পত্তি করা উচিত , বিশেষত যারা নামযুক্ত / ভাগ করা ওএস সংস্থানগুলির নিজস্বHttpClientকোনও ব্যতিক্রম নয়, যেহেতু ড্যারেল মিলার উল্লেখ করেছেন যে এটি বাতিলকরণ টোকেনগুলি বরাদ্দ করে, এবং অনুরোধ / প্রতিক্রিয়া সংস্থাগুলি নিয়ন্ত্রণহীন স্ট্রিম হতে পারে।
  2. তবে, এইচটিপিপ্লিয়েন্টের সেরা অনুশীলন বলছে আপনার একটি উদাহরণ তৈরি করা উচিত এবং যথাসম্ভব এটি পুনরায় ব্যবহার করা উচিত (এর থ্রেড-নিরাপদ সদস্যগুলিকে মাল্টি-থ্রেডেড পরিস্থিতিতে ব্যবহার করে)। অতএব, বেশিরভাগ পরিস্থিতিতে আপনি কখনই এটিকে নিষ্পত্তি করবেন না কারণ আপনার সর্বদা এটির প্রয়োজন হবে
  3. একই HTTPClient "চিরতরে" পুনরায় ব্যবহারের ক্ষেত্রে সমস্যাটি হ'ল ডিএনএস পরিবর্তনগুলি বিবেচনা না করেই অন্তর্নিহিত এইচটিটিপি সংযোগটি মূলত ডিএনএস-সমাধান হওয়া আইপি-এর বিরুদ্ধে উন্মুক্ত থাকতে পারেনীল / সবুজ স্থাপনা এবং ডিএনএস-ভিত্তিক ব্যর্থভারের মতো পরিস্থিতিতে এটি কোনও সমস্যা হতে পারে । এই সমস্যাটি মোকাবেলার জন্য বিভিন্ন পন্থা রয়েছে, Connection:closeডিএনএস পরিবর্তন ঘটে যাওয়ার পরে সার্ভারের মধ্যে সবচেয়ে নির্ভরযোগ্য একটি শিরোনাম প্রেরণ করে । আর একটি সম্ভাব্যতার HttpClientমধ্যে ক্লায়েন্টের পক্ষের পর্যায়ক্রমে বা ডিএনএস পরিবর্তন সম্পর্কে শিখতে পারে এমন কোনও প্রক্রিয়া ব্যবহার করে পুনর্ব্যবহার করা জড়িত । আরও তথ্যের জন্য https://github.com/dotnet/corefx/issues/11224 দেখুন (লিঙ্কযুক্ত ব্লগ পোস্টে প্রস্তাবিত কোডটি অন্ধভাবে ব্যবহার করার আগে আমি সাবধানে এটি পড়ার পরামর্শ দিই)।

আমি এটিকে
সারাক্ষণ

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

আপনার আপনার এইচটিপিপিলেয়েন্ট ধরে রাখা উচিত তবে আপনি সিস্টেম.নেট.সোর্সপয়েন্ট ম্যানেজআরডিএনএসআরফ্রেশটাইমআউট = 3000 এর মতো কিছু ব্যবহার করতে পারেন; এটি দরকারী যেমন উদাহরণস্বরূপ আপনি যদি এমন কোনও মোবাইল ডিভাইসে থাকেন যা যে কোনও সময় ওয়াইফাই এবং 4 জি এর মধ্যে স্যুইচ করতে পারে।
জোহান ফ্রানজান

18

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

মাইক্রোসফ্ট উদাহরণটি অগত্যা ভুল নয়। অ্যাপ্লিকেশনটি প্রস্থান করার সময় ব্যবহৃত সমস্ত সংস্থানগুলি মুক্তি দেওয়া হবে। এবং সেই উদাহরণের ক্ষেত্রে HttpClientএটি ব্যবহৃত হওয়ার প্রায় অবিলম্বে ঘটে happens মত ক্ষেত্রে, স্পষ্টত কল Dispose()করা কিছুটা অতিরিক্ত অতিরিক্ত।

তবে, সাধারণভাবে, যখন কোনও শ্রেণি প্রয়োগ করে IDisposable, বোঝাপড়াটি হ'ল Dispose()আপনি সম্পূর্ণ প্রস্তুত এবং সক্ষম হওয়ার সাথে সাথে এর উদাহরণগুলি আপনার উচিত । আমি উত্সাহিত করব বিশেষত HttpClientএটি ক্ষেত্রে সত্য যেখানে সম্পদ বা সংযোগগুলি খোলা / রাখা হচ্ছে কিনা তা স্পষ্টভাবে নথিভুক্ত করা হয়নি। সেই ক্ষেত্রে যেখানে সংযোগটি আবার ব্যবহার করা হবে [শীঘ্রই], আপনি Dipose()এটি সরিয়ে রাখতে চাইবেন - আপনি সেই ক্ষেত্রে "সম্পূর্ণ প্রস্তুত" নন।

এছাড়াও দেখুন: আইডিস্পোজেবল.ডিসপোজ পদ্ধতি এবং কখন ডিসপোজ কল করবেন


7
এটির মতো যদি কেউ আপনার বাড়িতে একটি কলা নিয়ে আসে, এটি খায় এবং খোসার সাথে দাঁড়িয়ে থাকে। তাদের খোসা দিয়ে কী করা উচিত? ... যদি তারা এটির সাথে দরজাটি বেরোতে চলেছে তবে তাদের যেতে দিন। যদি তারা চারপাশে আঁকড়ে ধরে থাকে তবে তাদের এটিকে আবর্জনায় ফেলে দিন যাতে এটি জায়গাটিকে দুর্গন্ধযুক্ত করে না।
এসভিডজেন

শুধু এই উত্তরটি পরিষ্কার করার জন্য, আপনি কি বলছেন, "প্রোগ্রামটি সঠিকভাবে ব্যবহার করার পরে যদি তা শেষ হয়ে যায় তবে তা নিষ্পত্তি করার দরকার নেই"? এবং যদি আপনার প্রোগ্রামটি কিছু সময়ের জন্য আরও কিছু কাজ চালিয়ে যাওয়ার প্রত্যাশা করা হয় তবে তা নিষ্পত্তি করা উচিত?
ফার্নান্দো কোরিয়া

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

আমি বুঝেছি. তবে এই প্রশ্নটি হ'ল এইচটিপিপ্লিনেন্ট এবং এইচটিপিপিপ্লায়েন্টহ্যান্ডলারের বিশেষ ক্ষেত্রে, তারা কি এইচটিটিপি সংযোগের মতো কোনও সংস্থান খোলা আছে? যদি এটি ঘটছে, তবে সেগুলি ব্যবহার করার জন্য আমার প্যাটার্নটি পুনর্বিবেচনা করতে হবে।
ফার্নান্দো কোরিয়া

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

9

নিষ্পত্তি () নীচের কোডটিতে কল করে, যা এইচটিটিপিপ্লিনেন্ট উদাহরণ দ্বারা খোলা সংযোগগুলি বন্ধ করে দেয়। কোডটি ডটপিকের সাথে পচন করে তৈরি করা হয়েছিল।

HttpClientHandler.cs - নিষ্পত্তি করুন

ServicePointManager.CloseConnectionGroups(this.connectionGroupName);

আপনি যদি ডিসপোজ কল না করেন তবে সার্ভিসপয়েন্ট ম্যানেজ.ম্যাক্স সার্ভিস পয়েন্টআইডলটাইম, যা একটি টাইমার দ্বারা চালিত হয়, এটি http সংযোগগুলি বন্ধ করে দেবে। ডিফল্টটি 100 সেকেন্ডের।

ServicePointManager.cs

internal static readonly TimerThread.Callback s_IdleServicePointTimeoutDelegate = new TimerThread.Callback(ServicePointManager.IdleServicePointTimeoutCallback);
private static volatile TimerThread.Queue s_ServicePointIdlingQueue = TimerThread.GetOrCreateQueue(100000);

private static void IdleServicePointTimeoutCallback(TimerThread.Timer timer, int timeNoticed, object context)
{
  ServicePoint servicePoint = (ServicePoint) context;
  if (Logging.On)
    Logging.PrintInfo(Logging.Web, SR.GetString("net_log_closed_idle", (object) "ServicePoint", (object) servicePoint.GetHashCode()));
  lock (ServicePointManager.s_ServicePointTable)
    ServicePointManager.s_ServicePointTable.Remove((object) servicePoint.LookupString);
  servicePoint.ReleaseAllConnectionGroups();
}

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


1
আপনি গিথুবে কোডটি দেখতেও পারেন। github.com/dotnet/corefx/blob/master/src/System.Net.Http/src/…
TamusJRoyce

8

সংক্ষিপ্ত উত্তর: না, বর্তমানে গৃহীত উত্তরের বিবৃতিটি সঠিক নয় : "সাধারণ sensকমত্যটি হল যে আপনাকে HTTPClient নিষ্পত্তি করার দরকার নেই (উচিত নয়)"।

দীর্ঘ উত্তর : নীচের দুটি বিবৃতি একই সাথে সত্য এবং অর্জনযোগ্য:

  1. অফিসিয়াল ডকুমেন্টেশন থেকে উদ্ধৃত "এইচটিপিপিএলিয়েন্ট একবার ইনস্ট্যান্ট করা এবং আবেদনের পুরো জীবন জুড়ে পুনরায় ব্যবহার করা হবে"
  2. কোনও IDisposableবস্তুর নিষ্পত্তি করার পরামর্শ দেওয়া হয়।

এবং তারা একে অপরের সাথে গুরুত্বপূর্ণভাবে বিবেচনা করবেন না। আপনি নিজের কোডটি পুনরায় ব্যবহার করতে কীভাবে সংগঠিত করছেন এটি কেবল বিষয়HttpClient এবং এটিকে এখনও সঠিকভাবে নিষ্পত্তি ।

আমার আর একটি উত্তর থেকে উদ্ধৃত একটি দীর্ঘতর উত্তর :

এটিতে লোকেদের দেখার জন্য একটি কাকতালীয় নয় কিছু ব্লগ পোস্ট অনুযোগ কিভাবে 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একবারে আরম্ভ করে তবে কখনও তা নিষ্পত্তি করে না, এজন্য আমরা এর নেটস্যাট আউটপুট থেকে দেখতে পাচ্ছি যে সংযোগটি ইস্টাব্লিশড অবস্থায় রয়েছে যার অর্থ এটি রয়েছে সঠিকভাবে বন্ধ করা হয়নি। যদি এটি বন্ধ করা হয়, তবে তার রাজ্যটি পরিবর্তে TIME_WAIT এ থাকবে। বাস্তবে, আপনার পুরো প্রোগ্রামটি শেষ হওয়ার পরে কেবল একটি সংযোগ খোলা বড় কথা নয় এবং ব্লগ পোস্টার এখনও ঠিক করার পরে একটি পারফরম্যান্স লাভ দেখতে পাবে; তবে তবুও, আইডিস্পোজেবলকে দোষ দেওয়া এবং এটি নিষ্পত্তি না করা চয়ন করা ধারণাগতভাবে ভুল।


এই ব্যাখ্যার জন্য আপনাকে ধন্যবাদ। এটি স্পষ্টতই lightকমত্যের দিকে কিছুটা আলোকপাত করেছে। আপনার মতামত থেকে, আপনি কখন কল করা উপযুক্ত বলে মনে করেন HttpClient.Dispose?
জেসন মারতাজায়া

@ জেসনমারতাজায়া, যখন আপনার অ্যাপ্লিকেশনটির আর httpClient উদাহরণ ব্যবহার করার দরকার নেই তখন তা নিষ্পত্তি করুন। আপনি ভাবতে পারেন যে এই জাতীয় পরামর্শটি অস্পষ্ট বলে মনে হচ্ছে তবে বাস্তবে এটি আপনার HttpClient clientভেরিয়েবলের জীবনচক্রের সাথে পুরোপুরি একত্রিত হতে পারে যা একটি প্রোগ্রামিং -১১১ জিনিস যা আপনি সম্ভবত ইতিমধ্যে যেভাবেই করছেন। আপনি এমনকি এখনও ব্যবহার করতে সক্ষম হতে পারে using (...) {...}। উদাহরণস্বরূপ, আমার উত্তরের ভিতরে হ্যালো ওয়ার্ল্ড নমুনা দেখুন।
রায়লুও

7

যেহেতু এটি এখানে উপস্থিত কেউ উল্লেখ করেছে বলে মনে হয় না, তাই। নেট কোর ২.১ এ এইচটিপিপ্লিনেন্ট এবং এইচটিটিপিপ্লিয়েন্টহ্যান্ডলার পরিচালনা করার নতুন সেরা উপায় হ'ল এইচটিপিপ্লিন্ট ফ্যাক্টরি ব্যবহার করছে

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

আপনার নেট নেট (২.১.১ বা তার পরে) প্রকল্পে নিম্নলিখিত প্যাকেজগুলি যুক্ত করুন:

Microsoft.AspNetCore.All
Microsoft.Extensions.Http

এটি স্টার্টআপ.কে যোগ করুন:

services.AddHttpClient();

ইনজেকশন এবং ব্যবহার:

[Route("api/[controller]")]
public class ValuesController : Controller
{
    private readonly IHttpClientFactory _httpClientFactory;

    public ValuesController(IHttpClientFactory httpClientFactory)
    {
        _httpClientFactory = httpClientFactory;
    }

    [HttpGet]
    public async Task<ActionResult> Get()
    {
        var client = _httpClientFactory.CreateClient();
        var result = await client.GetStringAsync("http://www.google.com");
        return Ok(result);
    }
}

আরও অনেক বৈশিষ্ট্যের জন্য স্টিভ ব্লগে পোস্টের সিরিজ অন্বেষণ করুন।


4

আমার ক্ষেত্রে, আমি এমন একটি পদ্ধতির অভ্যন্তরে এইচটিপিপ্লিনেন্ট তৈরি করছিলাম যা প্রকৃতপক্ষে পরিষেবা কল করেছিল। কিছুটা এইরকম:

public void DoServiceCall() {
  var client = new HttpClient();
  await client.PostAsync();
}

একটি অ্যাজুরে শ্রমিকের ভূমিকাতে, বার বার এই পদ্ধতিটি কল করার পরে (এইচটিটিপি ক্লিনেন্টকে নিষ্পত্তি না করে) অবশেষে এটি ব্যর্থ হবে SocketException (সংযোগ প্রচেষ্টা ব্যর্থ হয়েছে)।

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


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

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

@ ন্যাশওয়ান আপনি প্রতিটি অনুরোধের আগে শিরোনাম পরিষ্কার করতে এবং নতুন যুক্ত করতে পারবেন না?
মনদীপ জানজুয়া

মাইক্রোসফ্ট এইচটিটিপিপ্লিনেন্ট উদাহরণগুলি পুনরায় ব্যবহার করার পরামর্শ দিচ্ছে - ডকস.মাইক্রোসফটকম
জানজুয়া

@ মনদীপজঞ্জুয়া উদাহরণটি কনসোল অ্যাপ্লিকেশন হিসাবে ক্লায়েন্ট হিসাবে উপস্থিত বলে মনে হয়। আমি ক্লায়েন্ট হচ্ছে এমন একটি ওয়েব অ্যাপ্লিকেশন উল্লেখ করছি।
বাইপেটেভ

3

সাধারণ ব্যবহারে (প্রতিক্রিয়া <2 গিগাবাইট) এইচটিটিপিআরএসপোনসমেসেজগুলি নিষ্পত্তি করার প্রয়োজন হয় না।

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

  • আপনি যদি কোনও বাইট [] (যেমন: getByteArrayAsync) বা স্ট্রিংয়ের মধ্যে ডেটা পড়তে থাকেন তবে সমস্ত ডেটা পড়া হয়, তাই নিষ্পত্তি করার দরকার নেই।
  • অন্যান্য ওভারলোডগুলি 2 গিগাবাইট পর্যন্ত স্ট্রিমটি পড়ার জন্য ডিফল্ট হবে (এইচটিটিপি কমপ্লিটইপশনটি রিসপন্স কনটেন্টিড, এইচটিটিপিপ্লিনেন্ট M ম্যাক্স রিসপোনস কনটেন্টবার্ফারসাইফের ডিফল্ট 2 জিবি)

আপনি যদি রেসপন্সহাইডার্স রিডে এইচটিটিপি কমপ্লায়শন অপশনটি সেট করেন বা প্রতিক্রিয়া 2 জিবি-র চেয়ে বড় হয়, আপনার পরিষ্কার করা উচিত। এটি HTTPResponseMessage এ ডিসপোজ কল করে বা HttpResonseMessage সামগ্রী থেকে প্রাপ্ত স্ট্রিমে ডিসপোজ / ক্লোজ কল করে বা সামগ্রী সম্পূর্ণরূপে পড়ার মাধ্যমে করা যেতে পারে।

আপনি এইচটিটিপিপ্লাইয়েন্টে ডিসপোজ কল করবেন কিনা তা নির্ভর করে আপনি মুলতুবি থাকা অনুরোধগুলি বাতিল করতে চান কিনা তার উপর।


2

আপনি যদি এইচটিটিপিপ্লিনেন্টকে নিষ্পত্তি করতে চান তবে আপনি যদি এটি একটি উত্স পুল হিসাবে সেট আপ করতে পারেন। এবং আপনার অ্যাপ্লিকেশন শেষে, আপনি আপনার সংস্থান পুলটি নিষ্পত্তি করুন।

কোড:

// Notice that IDisposable is not implemented here!
public interface HttpClientHandle
{
    HttpRequestHeaders DefaultRequestHeaders { get; }
    Uri BaseAddress { get; set; }
    // ...
    // All the other methods from peeking at HttpClient
}

public class HttpClientHander : HttpClient, HttpClientHandle, IDisposable
{
    public static ConditionalWeakTable<Uri, HttpClientHander> _httpClientsPool;
    public static HashSet<Uri> _uris;

    static HttpClientHander()
    {
        _httpClientsPool = new ConditionalWeakTable<Uri, HttpClientHander>();
        _uris = new HashSet<Uri>();
        SetupGlobalPoolFinalizer();
    }

    private DateTime _delayFinalization = DateTime.MinValue;
    private bool _isDisposed = false;

    public static HttpClientHandle GetHttpClientHandle(Uri baseUrl)
    {
        HttpClientHander httpClient = _httpClientsPool.GetOrCreateValue(baseUrl);
        _uris.Add(baseUrl);
        httpClient._delayFinalization = DateTime.MinValue;
        httpClient.BaseAddress = baseUrl;

        return httpClient;
    }

    void IDisposable.Dispose()
    {
        _isDisposed = true;
        GC.SuppressFinalize(this);

        base.Dispose();
    }

    ~HttpClientHander()
    {
        if (_delayFinalization == DateTime.MinValue)
            _delayFinalization = DateTime.UtcNow;
        if (DateTime.UtcNow.Subtract(_delayFinalization) < base.Timeout)
            GC.ReRegisterForFinalize(this);
    }

    private static void SetupGlobalPoolFinalizer()
    {
        AppDomain.CurrentDomain.ProcessExit +=
            (sender, eventArgs) => { FinalizeGlobalPool(); };
    }

    private static void FinalizeGlobalPool()
    {
        foreach (var key in _uris)
        {
            HttpClientHander value = null;
            if (_httpClientsPool.TryGetValue(key, out value))
                try { value.Dispose(); } catch { }
        }

        _uris.Clear();
        _httpClientsPool = null;
    }
}

var হ্যান্ডলার = HttpClientHender.GetHttpClientHandle (নতুন উরি ("বেস url"))।

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

পারফেক্ট। আমি দেখতে পাচ্ছি যে আপনি যে Disposeপদ্ধতিতে আপনি সিসিতে নিবন্ধভুক্ত হন সেই কল করে। এটিকে শীর্ষে আরও রেট দেওয়া উচিত।
জেসন মারতাজায়া

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

1

আপনার কনস্ট্রাক্টরে নির্ভরতা ইনজেকশনটি ব্যবহার করা আপনার আজীবন পরিচালনা HttpClientসহজ করে তোলে - কোডটির প্রয়োজনীয়তার বাইরে জীবনকাল পরিচালনক গ্রহণ করা এবং এটি পরবর্তী সময়ে সহজেই পরিবর্তনযোগ্য করে তোলে।

আমার বর্তমান পছন্দটি হল একটি পৃথক http ক্লায়েন্ট শ্রেণি তৈরি করা যা HttpClientপ্রতি লক্ষ্য সমাপ্ত বিন্দু ডোমেন থেকে একবারে উত্তরাধিকার সূত্রে প্রাপ্ত হয় এবং তারপরে নির্ভরতা ইনজেকশন ব্যবহার করে একে সিঙ্গলটন তৈরি করে।public class ExampleHttpClient : HttpClient { ... }

তারপরে আমি পরিষেবা ক্লাসে কাস্টম HTTP ক্লায়েন্টের উপর কনস্ট্রাক্টর নির্ভরতা নিই যেখানে আমার সেই API এ প্রবেশাধিকার প্রয়োজন। এটি আজীবন সমস্যা সমাধান করে এবং সংযোগ পুলিংয়ের ক্ষেত্রে সুবিধা রয়েছে।

আপনি সম্পর্কিত উত্তরের একটি কাজের উদাহরণ https://stackoverflow.com/a/50238944/3140853 এ দেখতে পারেন


0

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

কোনও ওয়েবএপিআই ক্লায়েন্টে কল প্রতি নতুন এইচটিটিপিপ্লায়েন্ট তৈরির ওভারহেড কী?


-2

আমি মনে করি যে এইচটিটিপিপ্লিনেন্টের দৃষ্টান্ত তৈরি করতে এবং এটি সর্বদা বন্ধ করে দেওয়া এড়াতে কারওর সিঙ্গলটন প্যাটার্ন ব্যবহার করা উচিত। আপনি। নেট 4.0 ব্যবহার করছেন যদি আপনি নীচের হিসাবে একটি নমুনা কোড ব্যবহার করতে পারে। Singleton প্যাটার্ন সম্পর্কে আরও তথ্যের জন্য চেক এখানে

class HttpClientSingletonWrapper : HttpClient
{
    private static readonly Lazy<HttpClientSingletonWrapper> Lazy= new Lazy<HttpClientSingletonWrapper>(()=>new HttpClientSingletonWrapper()); 

    public static HttpClientSingletonWrapper Instance {get { return Lazy.Value; }}

    private HttpClientSingletonWrapper()
    {
    }
}

নীচের মত কোড ব্যবহার করুন।

var client = HttpClientSingletonWrapper.Instance;

3
এটি করার সময় (এবং অন্যান্য অনুরূপ স্কিমগুলি) নজর রাখার মতো কিছু: " কোনও উদাহরণ সদস্যদের থ্রেড নিরাপদ থাকার নিশ্চয়তা নেই are "
06

2
এই উত্তরটি সঠিক কিনা বা না আপনি এইচটিপসিপ্লায়েন্টটি যে অ্যাপ্লিকেশনটি থেকে ব্যবহার করতে চান তা নির্ভর করে totally আপনার যদি কোনও ওয়েব অ্যাপ্লিকেশন থাকে এবং এমন একটি সিঙ্গলটন এইচটিপিপ্লিয়েন্ট তৈরি করে যা সমস্ত ওয়েব অনুরোধগুলি তখন আপনার কাছ থেকে ভাগ করে নেবে সম্ভাব্যভাবে সংযোগ ব্যতিক্রমগুলি পেতে পারে (আপনার ওয়েবসাইটটি কতটা জনপ্রিয়! :-) এর উপর নির্ভর করে)। (ডেভিড
ফ্যাভেরের
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.