ব্যাকগ্রাউন্ড ওয়ার্কার বনাম ব্যাকগ্রাউন্ড থ্রেড


166

আমার উইন্ডোজ ফর্ম অ্যাপ্লিকেশনটিতে ব্যাকগ্রাউন্ড থ্রেড প্রয়োগের পছন্দটি সম্পর্কে স্টাইলিস্টিক প্রশ্ন রয়েছে। বর্তমানে আমার BackgroundWorkerএকটি ফর্ম রয়েছে যার একটি অসীম (while(true))লুপ রয়েছে। এই লুপটিতে আমি WaitHandle.WaitAnyআগ্রহের কিছু না হওয়া পর্যন্ত থ্রেডটি স্নোজ করে রাখতে ব্যবহার করি । আমি যে ইভেন্টটির জন্য অপেক্ষা করি তার মধ্যে একটি হ'ল একটি " StopThread" ইভেন্ট যাতে আমি লুপটি ভেঙে ফেলতে পারি। এই ইভেন্টটি যখন আমার ওভাররাইড থেকে সংকেতিত হয় Form.Dispose()

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

উত্তর:


88

আপনার প্রশ্নের আমার বোঝার থেকে আপনি BackgroundWorkerএকটি স্ট্যান্ডার্ড থ্রেড হিসাবে ব্যবহার করছেন ।

BackgroundWorkerআপনি ইউআই থ্রেডটি বেঁধে রাখতে চান না এমন কারণগুলির জন্য সুপারিশ করার কারণ হ'ল উইন ফর্মগুলি বিকাশ করার সময় এটি কিছু দুর্দান্ত ইভেন্ট প্রকাশ করে।

ইভেন্টগুলি RunWorkerCompletedথ্রেডটি যা করা দরকার তা শেষ হয়ে গেলে ProgressChangedএবং থ্রেডের অগ্রগতিতে জিইউআই আপডেট করার ইভেন্টটি সিগন্যাল করতে পছন্দ করে ।

সুতরাং আপনি যদি নেই এই ব্যবহার করে, আমি না কোন ক্ষতি আপনাকে যা করতে হবে কি জন্য একটি প্রমিত থ্রেড ব্যবহার করে দেখতে না।


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

আমি মনে করি ব্যাকগ্রাউন্ড ওয়ার্কার.আইএসবিসি আপনি সেখানে খুঁজছেন।
পরমেশান কোডিস

1
শুধুমাত্র ব্যবহার CancelAsync(এবং জন্য পরীক্ষার CancellationPendingযদি আপনার থ্রেড সংক্ষিপ্ত অন্তর উপর পোলিং হতে হবে, যদি আপনি একটি ব্যতিক্রম পরিবর্তে উত্থাপিত একটি ব্যবহার করতে চান System.Threading.Thread.Abort()যা থ্রেড ব্লক নিজেই মধ্যে একটি ব্যতিক্রম উত্থাপন, পরিস্থিতি জন্য সঠিক মডেল নির্বাচন করুন।
ব্রেট রায়ান

369

আমার কিছু চিন্তা ...

  1. ব্যাকগ্রাউন্ড ওয়ার্কার ব্যবহার করুন যদি আপনার একক টাস্ক থাকে যা পটভূমিতে চলে এবং ইউআইয়ের সাথে ইন্টারঅ্যাক্ট করার দরকার পড়ে। ইউআই থ্রেডে ডেটা এবং পদ্ধতি কলগুলি মার্শালিংয়ের কাজটি এর ইভেন্ট-ভিত্তিক মডেলের মাধ্যমে স্বয়ংক্রিয়ভাবে পরিচালিত হবে। ব্যাকগ্রাউন্ড ওয়ার্কার এড়ান যদি ...
    • আপনার সমাবেশটি ইউআইয়ের সাথে সরাসরি ইন্টারঅ্যাক্ট করে না বা থাকে না,
    • অগ্রভাগ থ্রেড হতে আপনার থ্রেডটি প্রয়োজন, বা
    • আপনার থ্রেড অগ্রাধিকার হেরফের করা প্রয়োজন।
  2. একটি থ্রেডপুল ব্যবহার করুনদক্ষতা যখন পছন্দ হয় তখন থ্রেড । থ্রেডপুল থ্রেড তৈরি, শুরু এবং থামানো সম্পর্কিত ওভারহেড এড়াতে সহায়তা করে। থ্রেডপুল ব্যবহার করা এড়িয়ে চলুন যদি ...
    • টাস্কটি আপনার আবেদনের আজীবন চলে,
    • অগ্রভাগ থ্রেড হতে আপনার থ্রেডটি দরকার,
    • আপনার থ্রেড অগ্রাধিকার হেরফের করতে হবে, বা
    • আপনার একটি নির্দিষ্ট পরিচয় (বাতিল, স্থগিতকরণ, আবিষ্কার) থ্রেডের প্রয়োজন need
  3. ব্যবহার করুন থ্রেড দীর্ঘক্ষন ধরে চলা কাজের জন্য বর্গ এবং আপনি একটি আনুষ্ঠানিক থ্রেডিং মডেল, যেমন,, পুরোভাগে এবং পশ্চাদপটে থ্রেড মধ্যে নির্বাচন থ্রেড সঞ্চালনের উপর থ্রেড অগ্রাধিকার, সূক্ষ্মাতিসূক্ষ্ম নিয়ন্ত্রণ tweaking, ইত্যাদি দ্বারা প্রদত্ত বৈশিষ্ট্য প্রয়োজন

10
ব্যাকগ্রাউন্ড কর্মী System.dll সমাবেশ এবং System.Comp घटक মডেল নেমস্পেসে is উইনফর্মগুলিতে কোনও নির্ভরতা নেই।
কুগেল

17
এটি সঠিক, তবে BackgroundWorkerকোনও আগ্রহী পক্ষের কাছে থ্রেড অগ্রগতির প্রতিবেদন করার জন্য ডিজাইন করা হয়েছে, যার মধ্যে সাধারণত একটি ইউআই থাকে। ক্লাসের জন্য এমএসডিএন ডকুমেন্টেশন এটি প্রচুর পরিমাণে পরিষ্কার করে দেয়। আপনার যদি কেবল পটভূমিতে সঞ্চালনের কোনও কাজ প্রয়োজন হয় তবে একটি ThreadPoolথ্রেড ব্যবহার করা পছন্দ করুন prefer
ম্যাট ডেভিস

5
System.Windows.Formsসমাবেশ সম্পর্কে আপনার মতামতের সাথে; BackgroundWorkerডাব্লুপিএফ অ্যাপ্লিকেশনগুলির জন্যও দরকারী এবং সেই অ্যাপ্লিকেশনগুলির উইনফোর্মে কোনও রেফারেন্স নাও থাকতে পারে।
গিডিআপহর্সি

12

ম্যাট ডেভিস নিম্নলিখিত অতিরিক্ত পয়েন্টগুলির সাথে অনেক কিছুই বলেছেন:

আমার জন্য প্রধান BackgroundWorkerডিফারেনেটরটি হল সম্পূর্ণরূপে ইভেন্টটির স্বয়ংক্রিয় মার্শেলিং SynchronizationContext। একটি ইউআই প্রসঙ্গে এর অর্থ হ'ল সম্পূর্ণ ইভেন্টটি ইউআই থ্রেডে আগুন লাগে এবং তাই ইউআই আপডেট করার জন্য ব্যবহার করা যেতে পারে। আপনি যদি BackgroundWorkerকোনও UI প্রসঙ্গে ব্যবহার করে থাকেন তবে এটি একটি প্রধান ডিফারেন্টিটার ।

কার্যগুলি মাধ্যমে মৃত্যুদন্ড কার্যকর করা ThreadPoolসহজে বাতিল করা যাবে না (এই অন্তর্ভুক্ত ThreadPoolQueueUserWorkItemএবং প্রতিনিধিদের asyncronously চালানো)। সুতরাং এটি থ্রেড স্পিনআপের ওভারহেড এড়িয়ে চলেছে, যদি আপনার প্রয়োজন হয় বাতিল করার প্রয়োজন হয় হয় হয় BackgroundWorker(বা সম্ভবত ইউআই এর বাইরে) একটি থ্রেড স্পিন করুন এবং এটিতে একটি রেফারেন্স রাখুন যাতে আপনি কল করতে পারেন Abort()


1
কেবলমাত্র ... আশা করি অ্যাপ্লিকেশনটি থ্রেডেড টাস্ক বন্ধ করার একটি পরিষ্কার পদ্ধতি সম্পর্কে নকশা করা হয়েছে (Abort সাধারণত এটি হয় না)

11

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


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

সম্পর্কিত: "... যা কেবলমাত্র সীমাবদ্ধ সংখ্যা হওয়ায় উদ্বেগের কারণ হতে পারে", আপনি কি বোঝাতে চান যে ওএসের অন্যান্য অ্যাপ্লিকেশনগুলিতে তাদের প্রয়োজন হতে পারে এবং একই 'পুল' থেকে ভাগ করা যেতে পারে?
ড্যান ডব্লিউ

8

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

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

BackgroundWorker.CancelAsync()সেট CancellationPendingকরে trueদিবে কিন্তু আরও কিছু করবে না, তারপরে ক্রমাগত এটি পরীক্ষা করার থ্রেডগুলির দায়িত্ব, মনে রাখবেন যে আপনার ব্যবহারকারীর বাতিল হওয়া এই পদ্ধতির সাথে আপনি কোনও রেসের শর্তটি শেষ করতে পারেন, তবে থ্রেডটি পরীক্ষার আগে সম্পূর্ণ হয়েছিল CancellationPending

Thread.Abort() অন্যদিকে থ্রেড এক্সিকিউশনের মধ্যে একটি ব্যতিক্রম ছুঁড়ে ফেলবে যা সেই থ্রেড বাতিলকরণকে কার্যকর করে, আপনি অবশ্যই এই বিপদটি হঠাৎ ফাঁসির ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে তোলা গেলে কী বিপজ্জনক হতে পারে সে সম্পর্কে আপনাকে অবশ্যই যত্নবান হতে হবে।

থ্রেডিংয়ের বিষয়ে আরও কিছু পড়ার জন্য, টাস্কটি যাই হোক না কেন খুব সাবধানতার সাথে বিবেচনা করা দরকার:

.NET ফ্রেমওয়ার্কে সমান্তরাল প্রোগ্রামিং পরিচালিত থ্রেডিং সেরা অভ্যাসগুলিতে


5

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

আমি এখনও অন্য ব্যক্তির পোস্টগুলিতে মন্তব্য করতে পারি না, সুতরাং পাইরেস 7 এর উত্তর ব্যবহারের ক্ষেত্রে আমার ক্ষণিকের খোঁড়াটিকে ক্ষমা করুন

Thread.Abort();পরিবর্তে ব্যবহার করবেন না , একটি ইভেন্টের সিগন্যাল করুন এবং সিগন্যাল করার সময় আপনার থ্রেডটি গ্রেফতার হয়ে শেষ করুন design থ্রেডের মৃত্যুদন্ড কার্যকর করার ক্ষেত্রে একটি নির্বিচারে বিন্দুতে Thread.Abort()উত্থাপন করে ThreadAbortException, যা অনাথ মনিটর, দুর্নীতিগ্রস্থ অংশীদারিত্বের অবস্থা ইত্যাদির মতো সমস্ত ধরণের অসুখী কাজ করতে পারে।
http://msdn.microsoft.com/en-us/library/system.threading.thread.abort.aspx


2

যদি এটি না ভেঙে যায় - এটি হওয়া পর্যন্ত ঠিক করুন ... ঠিক মজা করছেন :)

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


2

মূল পার্থক্যটি হ'ল আপনি যেমন বলেছিলেন, এর থেকে জিইউআই ইভেন্ট তৈরি করা BackgroundWorker। থ্রেডটি যদি প্রধান জিইউআই থ্রেডের জন্য ডিসপ্লে আপডেট করতে বা ইভেন্টগুলি তৈরি করার প্রয়োজন না হয় তবে এটি একটি সহজ থ্রেড হতে পারে।


2

আমি ব্যাকগ্রাউন্ড ওয়ার্কার ক্লাসের একটি আচরণটি উল্লেখ করতে চাই যা এখনও উল্লেখ করা হয়নি। থ্রেড.আইএসব্যাকগ্রাউন্ড সম্পত্তি সেট করে আপনি ব্যাকগ্রাউন্ডে চলার জন্য একটি সাধারণ থ্রেড তৈরি করতে পারেন।

ব্যাকগ্রাউন্ড থ্রেডগুলি অগ্রভাগ থ্রেডের সমান, ব্যাকগ্রাউন্ড থ্রেডগুলি কোনও প্রক্রিয়াটি শেষ হতে বাধা দেয় না। [ 1 ]

আপনি আপনার ফর্ম উইন্ডোটির কনস্ট্রাক্টরে নিম্নলিখিত পদ্ধতিটি কল করে এই আচরণটি পরীক্ষা করতে পারেন।

void TestBackgroundThread()
{
    var thread = new Thread((ThreadStart)delegate()
    {
        long count = 0;
        while (true)
        {
            count++;
            Debug.WriteLine("Thread loop count: " + count);
        }
    });

    // Choose one option:
    thread.IsBackground = true; // <--- This will make the thread run in background
    thread.IsBackground = false; // <--- This will delay program termination

    thread.Start();
}

যখন ইসব্যাকগ্রাউন্ড সম্পত্তিটি সেট করা থাকে এবং আপনি উইন্ডোটি বন্ধ করেন, তখন আপনার অ্যাপ্লিকেশনটি আদর্শভাবে শেষ হবে।

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

ব্যাকগ্রাউন্ড ওয়ার্কার ক্লাস একটি থ্রেড ব্যবহার করে যা পটভূমিতে চলে।


1

একটি পটভূমি কর্মী একটি শ্রেণি যা পৃথক থ্রেডে কাজ করে, তবে এটি অতিরিক্ত কার্যকারিতা সরবরাহ করে যা আপনি সাধারণ থ্রেডের সাথে পান না (যেমন টাস্ক প্রগ্রেস রিপোর্ট হ্যান্ডলিংয়ের মতো)।

যদি আপনার কোনও ব্যাকগ্রাউন্ড কর্মী দ্বারা প্রদত্ত অতিরিক্ত বৈশিষ্ট্যগুলির প্রয়োজন না হয় - এবং মনে হয় আপনি তা করেন না - তবে একটি থ্রেড আরও উপযুক্ত হবে।


-1

আমার কাছে বিভ্রান্ত করার বিষয়টি হ'ল ভিজ্যুয়াল স্টুডিও ডিজাইনার কেবল আপনাকে ব্যাকগ্রাউন্ড ওয়ার্কার্স এবং টাইমারগুলি ব্যবহার করতে দেয় যা আসলে পরিষেবা প্রকল্পের সাথে কাজ করে না।

এটি আপনাকে আপনার পরিষেবাতে পরিষ্কার ড্র্যাগ এবং ড্রপ নিয়ন্ত্রণ দেয় কিন্তু ... এমনকি এটি মোতায়েন করার চেষ্টাও করবেন না। কাজ হবে না।

পরিষেবাদি: কেবলমাত্র System.Timers.Timer System.Windows. Forms.Timer টি টুলবক্সে পাওয়া সত্ত্বেও কাজ করবে না

পরিষেবাদি: ব্যাকগ্রাউন্ড ওয়ার্কার্স যখন এটি পরিষেবা হিসাবে চলমান থাকে তখন কাজ করবে না read থ্রেডিং instead থ্রেডপুল পরিবর্তে বা অ্যাসিঙ্ক কলগুলি

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