অ্যাসিঙ্ক / অপেক্ষার বনাম ব্যাকগ্রাউন্ড ওয়ার্কার


162

গত কয়েকদিনে আমি। নেট 4.5 এবং সি # 5 এর নতুন বৈশিষ্ট্যগুলি পরীক্ষা করেছি।

আমি এর নতুন async / প্রত্যাশিত বৈশিষ্ট্যগুলি পছন্দ করি। এর আগে আমি ব্যবহার করেছিল BackgroundWorker প্রতিক্রিয়াশীল UI 'তে সঙ্গে ব্যাকগ্রাউন্ডে আর প্রসেস হ্যান্ডেল করতে।

আমার প্রশ্নটি হ'ল: এই দুর্দান্ত নতুন বৈশিষ্ট্যগুলি পাওয়ার পরে, আমি কখন async / প্রতীক্ষা করব এবং কখন একটি ব্যাকগ্রাউন্ড ওয়ার্কার করব ? উভয়ের জন্য সাধারণ পরিস্থিতি কোনটি?



উভয়ই ভাল, তবে যদি আপনি পুরানো কোড নিয়ে কাজ করছেন যা পরে। নেট সংস্করণে স্থানান্তরিত হয়নি; ব্যাকগ্রাউন্ড ওয়ার্কার দুটোতেই কাজ করে।
dcarl661

উত্তর:


74

async / প্রতীক্ষা যেমন কনস্ট্রাক্টগুলি প্রতিস্থাপনের জন্য ডিজাইন করা হয়েছে BackgroundWorker। আপনি চাইলে অবশ্যই এটি ব্যবহার করতে পারবেন, তবে বাইরে থাকা সমস্ত কিছু পরিচালনা করার জন্য আপনার কয়েকটি অন্যান্য টিপিএল সরঞ্জাম সহ অ্যাসিঙ্ক / অপেক্ষা করতে সক্ষম হওয়া উচিত।

যেহেতু উভয়ই কাজ করে, এটি কখন আপনি কখন ব্যবহার করবেন তা ব্যক্তিগত পছন্দ হিসাবে নেমে আসে। আপনার জন্য দ্রুত কি ? আপনার পক্ষে বোঝা কী সহজ ?


17
ধন্যবাদ। আমার জন্য অ্যাসিঙ্ক / প্রতীক্ষা অনেক বেশি পরিষ্কার এবং 'প্রাকৃতিক' বলে মনে হচ্ছে। বকগাউন্ড ওয়ার্কার আমার মতে কোডটি 'গোলমাল' করে তোলে।
টম

12
@ টম ওয়েল, সে কারণেই মাইক্রোসফ্ট এটি বাস্তবায়নে প্রচুর সময় এবং প্রচেষ্টা ব্যয় করেছিল। যদি এটির চেয়ে ভাল না হত তবে তারা বিরক্ত করতেন না
সার্ভে

5
হ্যাঁ. নতুন প্রতীক্ষিত স্টাফগুলি পুরানো ব্যাকগ্রাউন্ড ওয়ার্কারকে সম্পূর্ণ নিম্নমানের এবং অপ্রচলিত বলে মনে করে। পার্থক্য যে নাটকীয়।
usr

16
ব্যাকগ্রাউন্ড টাস্কের সাথে বিভিন্ন পদ্ধতির তুলনা করে আমার ব্লগে আমি বেশ সুন্দর একটি রিডাউন পেয়েছি । নোট করুন async/ থ্রেড পুল থ্রেড ছাড়াইawait অ্যাসিনক্রোনাস প্রোগ্রামিংয়ের অনুমতি দেয় ।
স্টিফেন ক্লিয়ারি

8
এই উত্তরটিকে অগ্রাহ্য করেছেন, এটি বিভ্রান্তিকর। অ্যাসিঙ্ক / অপেক্ষার প্রেক্ষাপট কর্মীদের প্রতিস্থাপনের জন্য ডিজাইন করা হয়নি।
কোয়াঙ্গো

206

এই সম্ভবত TL হয়; অনেকের জন্য ডিআর, কিন্তু, আমি তুলনা মনে awaitসঙ্গে BackgroundWorkerএই অনুসরণ আপেল এবং কমলা এবং আমার ভাবনা তুলনা মত হল:

BackgroundWorkerআপনি কোনও থ্রেড পুলের থ্রেডে পটভূমিতে সম্পাদন করতে চান এমন একটি কাজকে মডেল করার উদ্দেশ্যে। async/ awaitঅ্যাসিঙ্ক্রোনাস অপারেশনের অপেক্ষায় অবিচ্ছিন্নভাবে জন্য একটি বাক্য গঠন। এই ক্রিয়াকলাপগুলি থ্রেড পুলের থ্রেড ব্যবহার করতে পারে না বা অন্য কোনও থ্রেড ব্যবহার করতে পারে । সুতরাং, তারা আপেল এবং কমলা।

উদাহরণস্বরূপ, আপনি নিম্নলিখিতগুলির মতো কিছু করতে পারেন await:

using (WebResponse response = await webReq.GetResponseAsync())
{
    using (Stream responseStream = response.GetResponseStream())
    {
        int bytesRead = await responseStream.ReadAsync(buffer, 0, buffer.Length);
    }
}

তবে, আপনি সম্ভবত কখনও মডেল করতেন না যে কোনও পটভূমি কর্মী হিসাবে আপনি সম্ভবত নেট নেট 4.0.০ (এর আগে await) তে কিছু করতেন:

webReq.BeginGetResponse(ar =>
{
    WebResponse response = webReq.EndGetResponse(ar);
    Stream responseStream = response.GetResponseStream();
    responseStream.BeginRead(buffer, 0, buffer.Length, ar2 =>
    {
        int bytesRead = responseStream.EndRead(ar2);
        responseStream.Dispose();
        ((IDisposable) response).Dispose();
    }, null);
}, null);

দুটি সিনট্যাক্সের মধ্যে এবং আপনি কীভাবে / usingছাড়া ব্যবহার করতে পারবেন না তার মধ্যে তুলনা করে ডিসপোজারের বিরক্তি লক্ষ্য করুন ।asyncawait

তবে, আপনি এরকম কিছু করবেন না BackgroundWorkerBackgroundWorkerসাধারণত এমন একক দীর্ঘ-চলমান অপারেশনকে মডেলিংয়ের জন্য যা আপনি ইউআই প্রতিক্রিয়াশীলতার উপর প্রভাব ফেলতে চান না। উদাহরণ স্বরূপ:

worker.DoWork += (sender, e) =>
                    {
                    int i = 0;
                    // simulate lengthy operation
                    Stopwatch sw = Stopwatch.StartNew();
                    while (sw.Elapsed.TotalSeconds < 1)
                        ++i;
                    };
worker.RunWorkerCompleted += (sender, eventArgs) =>
                                {
                                    // TODO: do something on the UI thread, like
                                    // update status or display "result"
                                };
worker.RunWorkerAsync();

আপনার পক্ষে অ্যাসিঙ্ক ব্যবহার / অপেক্ষা করতে পারবেন এমন কিছুই নেই, আপনার BackgroundWorkerজন্য থ্রেড তৈরি করছে।

এখন, আপনি পরিবর্তে টিপিএল ব্যবহার করতে পারেন:

var synchronizationContext = TaskScheduler.FromCurrentSynchronizationContext();
Task.Factory.StartNew(() =>
                      {
                        int i = 0;
                        // simulate lengthy operation
                        Stopwatch sw = Stopwatch.StartNew();
                        while (sw.Elapsed.TotalSeconds < 1)
                            ++i;
                      }).ContinueWith(t=>
                                      {
                                        // TODO: do something on the UI thread, like
                                        // update status or display "result"
                                      }, synchronizationContext);

যে ক্ষেত্রে আপনার TaskSchedulerজন্য থ্রেড তৈরি করছে (ডিফল্ট ধরে নিচ্ছে TaskScheduler), এবং awaitনিম্নলিখিত হিসাবে ব্যবহার করতে পারে :

await Task.Factory.StartNew(() =>
                  {
                    int i = 0;
                    // simulate lengthy operation
                    Stopwatch sw = Stopwatch.StartNew();
                    while (sw.Elapsed.TotalSeconds < 1)
                        ++i;
                  });
// TODO: do something on the UI thread, like
// update status or display "result"

আমার মতে, একটি বড় তুলনা হ'ল আপনি অগ্রগতির প্রতিবেদন করছেন কিনা। উদাহরণস্বরূপ, আপনার এটি থাকতে পারে BackgroundWorker like:

BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.ProgressChanged += (sender, eventArgs) =>
                            {
                            // TODO: something with progress, like update progress bar

                            };
worker.DoWork += (sender, e) =>
                 {
                    int i = 0;
                    // simulate lengthy operation
                    Stopwatch sw = Stopwatch.StartNew();
                    while (sw.Elapsed.TotalSeconds < 1)
                    {
                        if ((sw.Elapsed.TotalMilliseconds%100) == 0)
                            ((BackgroundWorker)sender).ReportProgress((int) (1000 / sw.ElapsedMilliseconds));
                        ++i;
                    }
                 };
worker.RunWorkerCompleted += (sender, eventArgs) =>
                                {
                                    // do something on the UI thread, like
                                    // update status or display "result"
                                };
worker.RunWorkerAsync();

তবে, আপনি এর কিছুটি মোকাবেলা করবেন না কারণ আপনি কোনও ফর্মের নকশার পৃষ্ঠায় ব্যাকগ্রাউন্ড কর্মী উপাদানটি টানুন এবং ফেলেছেন - এমন কিছু যা আপনি async/ awaitএবং Task... সহ করতে পারবেন না ... অর্থাৎ আপনি জিতেছেন ' টি ম্যানুয়ালি অবজেক্টটি তৈরি করুন, বৈশিষ্ট্যগুলি সেট করুন এবং ইভেন্ট হ্যান্ডলারগুলি সেট করুন। আপনি শুধুমাত্র দেহের ভরিয়ে তুলবে DoWork, RunWorkerCompletedআর ProgressChangedইভেন্ট হ্যান্ডলার।

যদি আপনি এটিকে async / অপেক্ষায় "রূপান্তরিত" করেন তবে আপনি এমন কিছু করতে চাই:

     IProgress<int> progress = new Progress<int>();

     progress.ProgressChanged += ( s, e ) =>
        {
           // TODO: do something with e.ProgressPercentage
           // like update progress bar
        };

     await Task.Factory.StartNew(() =>
                  {
                    int i = 0;
                    // simulate lengthy operation
                    Stopwatch sw = Stopwatch.StartNew();
                    while (sw.Elapsed.TotalSeconds < 1)
                    {
                        if ((sw.Elapsed.TotalMilliseconds%100) == 0)
                        {
                            progress.Report((int) (1000 / sw.ElapsedMilliseconds))
                        }
                        ++i;
                    }
                  });
// TODO: do something on the UI thread, like
// update status or display "result"

ডিজাইনার পৃষ্ঠে কোনও উপাদানকে টেনে আনার ক্ষমতা ছাড়াই কোনটি "ভাল" তা ঠিক করার বিষয়টি পাঠকের পক্ষে সত্য। কিন্তু, যে, আমার কাছে মধ্যবর্তী তুলনা হয় awaitএবং BackgroundWorkerনা আপনি অপেক্ষা করুন বিল্ট ইন মত পদ্ধতি পারে কিনা Stream.ReadAsync। উদাহরণস্বরূপ আপনি যদি BackgroundWorkerইচ্ছাকৃত ব্যবহার করে থাকেন তবে ব্যবহারে রূপান্তর করা শক্ত হতে পারে await

অন্যান্য চিন্তা: http://jeremybytes.blogspot.ca/2012/05/backgroundworker-component-im-not-dead.html


2
আমার মনে হয় যে ত্রুটি async / অপেক্ষার সাথে বিদ্যমান রয়েছে তা হ'ল আপনি একাধিক async কাজ একবারে শুরু করতে চাইতে পারেন। অপেক্ষার অর্থ হ'ল পরবর্তী কাজটি শুরু করার আগে প্রতিটি কাজ শেষ হওয়ার জন্য অপেক্ষা করা। এবং যদি আপনি অপেক্ষার কীওয়ার্ডটি বাদ দেন তবে পদ্ধতিটি সিঙ্ক্রোনাসিকভাবে চলে যা যা আপনি চান তা নয়। আমি মনে করি না async / প্রতীক্ষা কোনও সমস্যার সমাধান করতে পারে যেমন "এই 5 টি কার্য শুরু করুন এবং যখন প্রতিটি কার্য কোনও নির্দিষ্ট ক্রমে না করা হয় তখন আমাকে ফিরে কল করুন"।
ট্রেভর এলিয়ট

4
@Moozhe। সত্য না, আপনি করতে পারেন var t1 = webReq.GetResponseAsync(); var t2 = webReq2.GetResponseAsync(); await t1; await t2;। যা দুটি সমান্তরাল অপারেশনের জন্য অপেক্ষা করবে। প্রতীক্ষা অনেক অ্যাসিঙ্ক্রোনাস জন্য ভালো, কিন্তু অনুক্রমিক টাস্ক, আইএমও ...
পিটার রিচি

2
@ মোজে হ্যাঁ, সেভাবে এটি করা একটি নির্দিষ্ট ক্রম বজায় রাখে - যেমনটি আমি উল্লেখ করেছি। এই প্রতীক্ষার মূল পয়েন্টটি হল অনুক্রমিক-বর্ণন কোডটিতে অ্যাসিনক্রোনাইটিটি পাওয়া। await Task.WhenAny(t1, t2)উভয় কাজ প্রথমে শেষ হলে আপনি অবশ্যই কিছু করতে ব্যবহার করতে পারেন। অন্যান্য কাজটিও শেষ হয়েছে কিনা তা নিশ্চিত করার জন্য আপনি সম্ভবত একটি লুপ চান। সাধারণত আপনি যখন কোনও নির্দিষ্ট টাস্ক শেষ করেন তা জানতে চান , যা আপনাকে অনুক্রমিক লেখার দিকে নিয়ে যায় await
পিটার রিচি


5
সততা, ব্যাকগ্রাউন্ড ওয়ার্কার আইও-বাউন্ড অপারেশনের জন্য কখনই ভাল ছিল না
পিটার রিচি

21

এটি একটি ভাল ভূমিকা: http://msdn.microsoft.com/en-us/library/hh191443.aspx থ্রেডস বিভাগটি আপনি যা খুঁজছেন ঠিক তেমন:

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

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

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


"আইও-বাউন্ড অপারেশনের জন্য কারণ কোডটি সহজ এবং আপনার রেস শর্তগুলির বিরুদ্ধে রক্ষা করতে হবে না" কোন রেসের শর্তগুলি ঘটতে পারে, আপনি একটি উদাহরণ দিতে পারেন?
ইরান otzap

8

ব্যাকগ্রাউন্ড ওয়ার্কার স্পষ্টভাবে। নেট 4.5 এ অপ্রচলিত হিসাবে লেবেলযুক্ত:

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

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

হালনাগাদ

  • @ ইরান-ওটজাপের এই মন্তব্যের জবাবে :
    "আইও-বাউন্ড অপারেশনের জন্য কারণ কোডটি সহজ এবং আপনাকে রেসের শর্তগুলির বিরুদ্ধে রক্ষা করতে হবে না" কোন রেসের শর্তগুলি ঘটতে পারে, আপনি একটি উদাহরণ দিতে পারেন? "

এই প্রশ্নটি আলাদা পোস্ট হিসাবে রাখা উচিত ছিল।

রেসকিউ শর্ত সম্পর্কে উইকিপিডিয়ায় একটি ভাল ব্যাখ্যা রয়েছে । এর প্রয়োজনীয় অংশটি মাল্টিথ্রিডিং এবং একই এমএসডিএন নিবন্ধ থেকে অ্যাসিঙ্ক এবং আওয়েট (সি # এবং ভিজ্যুয়াল বেসিক) সহ অ্যাসিনক্রোনাস প্রোগ্রামিং :

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

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

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

এটি হল, "অ্যাসিঙ্ক এবং অপেক্ষার কীওয়ার্ডগুলির কারণে অতিরিক্ত থ্রেড তৈরি হওয়ার কারণ হয় না"।

এক বছর আগে আমি যখন এই নিবন্ধটি অধ্যয়ন করছিলাম তখন আমি আমার নিজের প্রচেষ্টাগুলি স্মরণ করতে পারি, আপনি যদি একই নিবন্ধ থেকে কোডের নমুনা নিয়ে চালিত এবং খেলেন, তবে আপনি এমন পরিস্থিতিতে হুমকিতে পড়তে পারেন যে এটির অ-অ্যাসিঙ্ক সংস্করণগুলি (আপনি রূপান্তর করতে চেষ্টা করতে পারেন) এটি নিজের কাছে) অনির্দিষ্টকালের জন্য ব্লক করুন!

এছাড়াও, কংক্রিটের উদাহরণগুলির জন্য আপনি এই সাইটটি অনুসন্ধান করতে পারেন। এখানে কিছু উদাহরণ দেওয়া হয়েছে:


30
ব্যাকগ্রন্ড ওয়ার্কারকে স্পষ্টভাবে। নেট 4.5 এ অপ্রচলিত হিসাবে লেবেল দেওয়া হয়নি । এমএসডিএন নিবন্ধটি কেবল বলেছে যে অ্যাসিঙ্ক পদ্ধতিগুলির সাথে আইও-বাউন্ড অপারেশনগুলি আরও ভাল - ব্যাকগ্রাউন্ড ওয়ার্কার ব্যবহারের অর্থ এই নয় যে আপনি অ্যাসিঙ্ক পদ্ধতি ব্যবহার করতে পারবেন না।
পিটার রিচি 14

@ পিটাররিচি, আমি আমার উত্তর সংশোধন করেছি। আমার জন্য, "বিদ্যমান পন্থাগুলি অপ্রচলিত" এর সমার্থক শব্দ "অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংয়ের জন্য অ্যাসিঙ্ক-ভিত্তিক পদ্ধতির প্রায় প্রতিটি ক্ষেত্রেই বিদ্যমান পদ্ধতির চেয়ে ভাল"
জেনাডি ভ্যানিন: Ванин

7
আমি সেই এমএসডিএন পৃষ্ঠাটি দিয়েছি। একটির জন্য, আপনি বিসডাব্লুয়ের সাথে টাস্কের চেয়ে আর "সমন্বয়" করবেন না। এবং, হ্যাঁ BGW কখনই সরাসরি আইও অপারেশন করানোর উদ্দেশ্য ছিল না - বিজিডাব্লুয়ের চেয়ে আইও করার আরও ভাল উপায় সবসময়ই হত। অন্য উত্তরটি দেখায় যে বিজিডাব্লু টাস্কের চেয়ে বেশি জটিল নয়। এবং আপনি যদি BGW সঠিকভাবে ব্যবহার করেন তবে কোনও রেসের শর্ত নেই।
পিটার রিচি

"আইও-বাউন্ড অপারেশনের জন্য কারণ কোডটি সহজ এবং আপনার রেস শর্তগুলির বিরুদ্ধে রক্ষা করতে হবে না" কোন রেসের শর্তগুলি ঘটতে পারে, আপনি একটি উদাহরণ দিতে পারেন?
ইরান otzap

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