async + অপেক্ষা == সিঙ্ক?


24

এই পোস্টটিতে হোঁচট খেয়েছে যে অ্যাসিঙ্ক ওয়েব অনুরোধ করার বিষয়ে কথা বলে।

এখন সরলতা একদিকে রেখে, যদি সত্যিকারের বিশ্বে, আপনারা যা কিছু করেন তা হ'ল একটি অ্যাসিঙ্ক অনুরোধ করা এবং একেবারে পরের লাইনে অপেক্ষা করা, এটি কি প্রথম স্থানে সিঙ্ক কল করার মতো নয়?


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

2
এটি তবে অ্যাসিঙ্কের সাথে আপনি একই সাথে অন্য একটি এসিঙ্ক করতে পারেন এবং তারপরে ২ এর জন্য অপেক্ষা করতে পারেন, সিঙ্কের মাধ্যমে এটি সম্ভব নয়
র‌্যাচেট ফ্রিক

সি # তে অ্যাসিঙ্কের আন্ডার-দ্য হুডের কয়েকটি নিয়ে আলোচনা করা একটি নিবন্ধ ( টমাস্পটনেট / ব্লগ / ক্যাসিলেশন-ইনটার্নালস.এএসপিএক্স ) - এটি সি # এবং এফ # তে অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংয়ের একটি সিরিজের অংশ।
পল

@ আর্টচেটফ্রাক: হ্যাঁ, আপনি একাধিক কল করছেন কিনা তা বলার অপেক্ষা রাখে না।
মিচিফ

@ R0MANARMY: যদি আপনার অ্যাপ্লিকেশন অন্য কিছু করে, তবে হ্যাঁ এবং async + অপেক্ষা এটি সক্ষম করে। আকীম সেরা বলে! তবে কল্পনা করুন যে কোডটি বাটন_ক্লিক হ্যান্ডলারটিতে নেই, বা এই জাতীয় কোনও ইভেন্ট হ্যান্ডলার নেই। যদি কেউ কোনও পদ্ধতিতে অন্ধভাবে কোডটি (async + প্রতীক্ষিত লাইনগুলি) অনুলিপি করে থাকে তবে এটি মিথ্যা ধারণা তৈরি করতে পারে যে আপনার কোডটি অ্যাসিঙ্ক তবে কার্যকর হতে পারে না।
মিচিফ

উত্তর:


32

না, ধারাবাহিকতারasync + await != sync কারণে

এমএসডিএন থেকে 'এসিঙ্ক এবং আওয়েট (সি # এবং ভিজ্যুয়াল বেসিক) সহ অ্যাসিনক্রোনাস প্রোগ্রামিং'

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

উদাহরণস্বরূপ, অ্যাসিঙ্ক এক্সিকিউশন ইউআই থ্রেডকে ব্লক করবে না, এবং Some TextBox.Textডাউনলোড শেষ হওয়ার পরে আপডেট হবে

private async void OnButtonClick()
{
   SomeTextBox.Text = await new WebClient().DownloadStringTaskAsync("http://stackoverflow.com/");
}

খুব সুন্দর করে বললেন!
মিঃচিফ

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

কি হবে Console.WriteLine(await GetStringOverNetwork());? আপনার যদি অ্যাসিনক্রোনাস অনুরোধের আউটপুট প্রয়োজন? থ্রেডটি সম্ভাব্যভাবে কার্যকর করা চালিয়ে যেতে পারলেও প্রথম অ্যাক্সেসে কি প্রোগ্রামটি ব্লক হবে?
অ্যান্ড্রু

6

না এটা এক নয়।

আপনার asyncকোড ব্লকটি awaitকলটি চালিয়ে যাওয়ার জন্য ফিরে আসার অপেক্ষায় রয়েছে , তবে আপনার বাকি অ্যাপ্লিকেশনটি অপেক্ষা করছে না এবং এখনও স্বাভাবিকের মতো চালিয়ে যেতে পারে।

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


সিঙ্ক কলটি async + অপেক্ষারূপে কার্যকর করা যায়নি?
র‌্যাচেট ফ্রিক

@ratchetfreak আমি মনে করি অপেক্ষা / অ্যাসিঙ্ক সেট আপ করার জন্য কিছু ওভারহেড রয়েছে, সুতরাং আমি মনে করি না যে আপনি এটির সাথে পুরো অ্যাপ্লিকেশনটি কোড করতে চান। আমি কেবল কোডের সম্ভাব্য দীর্ঘ-চলমান ব্লকগুলি কার্যকর করতে এটি ব্যবহার করি যাতে এটি আমার অ্যাপ্লিকেশনগুলিকে লক না করে। :)
রাহেল

5

অ্যাসিঙ্ক / অপেক্ষার বিষয়ে দয়া করে আমাকে বিষয়গুলি পরিষ্কার করার অনুমতি দিন।

অপেক্ষা যখন অন্তর্নিহিত রাষ্ট্র মেশিনের মুখোমুখি হয় তখন নিয়ন্ত্রণটি তত্ক্ষণাত ফিরিয়ে আনতে দেয়। তারপরে, যখন প্রতীক্ষিত কলটি শেষ হয়, অন্তর্নিহিত রাষ্ট্রের মেশিনটি প্রতীক্ষিত কলটির পরে এক্সিকিউশনটিকে লাইনে আবার শুরু করার অনুমতি দেয়।

অতএব, অ্যাসিঙ্ক ব্লকটি অবরুদ্ধ নয় বা অপেক্ষিত কলটি শেষ হওয়ার অপেক্ষায় রয়েছে; অপেক্ষার কমান্ডটি উপস্থিত হওয়ার সাথে সাথে নিয়ন্ত্রণটি তত্ক্ষণাত ফিরিয়ে দেওয়া হয়।

অন্তর্নিহিত রাষ্ট্র মেশিনটি async / অপেক্ষার ব্যবহারের পিছনে "যাদু" এর অংশ যা অপব্যবহার করা হয় না এবং মিস হয় না।


2

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

উল্লিখিত অ্যাসিক্রোনাস প্রোগ্রামিং থেকে :

  • asyncশব্দ একটি ASYNC পদ্ধতি, যা আপনি ব্যবহার করতে পারবেন মধ্যে একটি পদ্ধতি সক্রিয় awaitতার শরীরে শব্দ।
  • যখন awaitশব্দ প্রয়োগ করা হয়, এটি আহ্বান পদ্ধতি স্থগিত এবং উৎপাদনের তার আহ্বানকারী ফিরে নিয়ন্ত্রণ পর্যন্ত প্রতীক্ষিত কাজটি সম্পূর্ণ।
  • awaitকেবল কোনও asyncপদ্ধতির অভ্যন্তরে ব্যবহার করা যেতে পারে ।

প্রসঙ্গটি যে মুখোমুখি হয় awaitতা কী অবরুদ্ধ হয়ে যায়?

  • হ্যাঁ । মৃত্যুদন্ড কার্যকর করার প্রসঙ্গে একটি পরিচিত রাষ্ট্র বজায় রাখতে এটি মূলত স্থানীয় সিঙ্ক বাধা; অন্যান্য বিষয়গুলি ব্যতীত, যদি কোনও হয়, যোগদান করা হয় না।

অ্যাপ্লিকেশন বাকি কি এ ব্লক করে await?

  • এটি আপনার অ্যাপ্লিকেশন কীভাবে লিখিত হয় তার উপর নির্ভর করে। যদি এটি awaitএকই প্রসঙ্গে ধারাবাহিকভাবে চালু করা নির্ভরশীল এড কার্যগুলির একটি সিরিজ হয় (দেখুন: কিছু async বোঝার চেষ্টা করছেন / আচরণের জন্য অপেক্ষা করুন )

    await asyncCall1();
    await asyncCall2();  // waits for asyncCall1() to complete

    এইভাবে প্রতিটি awaitপরেরটির spawning ব্লক করবে।

    অন্যদিকে, সমান্তরালে চালু করা একই নির্ভরশীল কাজগুলি সমান্তরালে সম্পাদন করবে এবং প্রসঙ্গটি কেবল শ্রদ্ধায় অবরুদ্ধ হবে। await:

    Task<int> t1 = asyncCall1();
    Task<string> t2 = asyncCall2();  // runs in parallel with asyncCall1()
    int val = await t1;
    string str = await t2;  // waits for asyncCall1() to complete

    সাধারণভাবে, awaitবহিরাগত প্রেক্ষাপটে ফলন পাওয়া যায়, যেখান থেকে বর্তমান প্রসঙ্গে বলা হয়। যাইহোক, যদি বাহ্যিক প্রসঙ্গটি নিজেই বর্তমানের জন্য অপেক্ষা করে থাকে তবে এটি awaitএকই প্রসঙ্গে একটি অনুক্রমের মতো ।

সুতরাং, asyncসুবিধাগুলি কাটাতে , একাধিক সমান্তরাল প্রসঙ্গ (ইউআই, ডেটা-ক্লায়েন্ট ইত্যাদি) চালানোর জন্য অ্যাপ্লিকেশনটি ডিজাইন করা দরকার, তারপরে awaitএকটি প্রসঙ্গে অন্য প্রসঙ্গে প্রযোজ্যতা পাওয়া যায়, সুতরাং পুরো অ্যাপ্লিকেশনটি কোনও ব্যক্তির উপর অবরুদ্ধ হয় না await

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