বিবৃতি ব্যবহার করে কীওয়ার্ডগুলি সি # তে সুন্দরভাবে খেলুন


104

আমার এমন পরিস্থিতি রয়েছে যেখানে আমি এমন asyncপদ্ধতিতে কল করছি যা ফিরে আসে এবং IDisposableউদাহরণ দেয়। উদাহরণ স্বরূপ:

HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com"));

এখন asyncদৃশ্যে আসার আগে , যখন কোনও IDisposableউদাহরণের সাথে কাজ করার সময় , এই কল এবং কোড যা "প্রতিক্রিয়া" ভেরিয়েবল ব্যবহার করেছিল তা একটি ব্যবহারের বিবৃতিতে আবৃত হবে।

আমার প্রশ্ন হ'ল asyncকীওয়ার্ডটি মিশ্রণে নিক্ষেপ করা হলে এটি এখনও সঠিক পন্থা ? কোডটি সংকলন করা সত্ত্বেও, ব্যবহারের বিবৃতিটি নীচের দুটি উদাহরণে প্রত্যাশার মতো এখনও কাজ করবে?

উদাহরণ 1

using(HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com")))
{
    // Do something with the response

    return true;
}

উদাহরণ 2

using(HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.google.com")))
{
    await this.responseLogger.LogResponseAsync(response);

    return true;
}

উত্তর:


100

হ্যাঁ, এটা ঠিক করা উচিত।

প্রথম ক্ষেত্রে, আপনি সত্যিই বলছেন:

  • আমরা প্রতিক্রিয়া না পাওয়া পর্যন্ত অবিচ্ছিন্নভাবে অপেক্ষা করুন
  • এটি ব্যবহার করুন এবং অবিলম্বে এটি নিষ্পত্তি করুন

দ্বিতীয় ক্ষেত্রে, আপনি বলছেন:

  • আমরা প্রতিক্রিয়া না পাওয়া পর্যন্ত অবিচ্ছিন্নভাবে অপেক্ষা করুন
  • আমরা প্রতিক্রিয়া লগ না করা পর্যন্ত অবিচ্ছিন্নভাবে অপেক্ষা করুন
  • সাড়া ফেলে দিন

usingএকটি অ্যাসিঙ্ক পদ্ধতিতে একটি বিবৃতি "বিজোড়" যাতে Disposeকলটি সেই রিসোর্সটি অর্জনকারীটিকে (সিঙ্ক্রোনাইজেশন প্রসঙ্গে ইত্যাদির উপর নির্ভর করে) আলাদা থ্রেডে কার্যকর করতে পারে তবে এটি এখনও ঘটবে ... ধরে নিচ্ছেন যে জিনিসটির জন্য আপনি অপেক্ষা করছেন কি দেখায় বা ব্যর্থ, অবশ্যই। (ঠিক যেমন Disposeআপনার usingবিবৃতিতে কোনও পদ্ধতিতে কল আসে যা কখনই প্রত্যাবর্তন করে না আপনি অ-অ্যাসিঙ্ক কোডে কলিং শেষ করবেন না ))


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

@ জোনস্কিটের জন্য অপেক্ষা করা উচিত এমনকি কোনও using(){...}ব্লকের ভিতরেও এটি ব্যবহার করা উচিত বা এটি একটি ওভারকিল বা কিছু ক্ষেত্রে পারফরম্যান্সকে হ্রাস করতে পারে? না using(){...}হিসাবে একই উদ্দেশ্য পরিবেশন await?
নাম

4
@ নাম: না, usingএবং awaitসম্পূর্ণ ভিন্ন উদ্দেশ্যে পরিবেশন করুন। মনে রাখবেন যে সি # 8 এর পাশাপাশি এখন অ্যাসিনক্রোনাস নিষ্পত্তিও রয়েছে। যদিও আমার উত্তর হাইলাইটগুলি থ্রেডিং ইস্যু সম্পর্কে সচেতন হওয়া মূল্যবান, তবে অবশ্যই এর অর্থ এটি মিশ্রিত করা ভুল নয় usingএবং await
জন স্কিটি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.