থ্রেড তৈরি করা হচ্ছে - টাস্ক.ফ্যাক্টরি.স্টার্টনিউ বনাম নতুন থ্রেড ()


102

আমি। নেট 4 এ নতুন থ্রেডিং এবং সমান্তরাল গ্রন্থাগারগুলি সম্পর্কে শিখছি

অতীতে আমি এর মতো একটি নতুন থ্রেড তৈরি করতাম (উদাহরণ হিসাবে):

DataInThread = new Thread(new ThreadStart(ThreadProcedure));
DataInThread.IsBackground = true;
DataInThread.Start();

এখন আমি করতে পারি:

Task t = Task.Factory.StartNew(() =>
{
   ThreadProcedure();
});

পার্থক্য যদি কোন হয়?

ধন্যবাদ


1
থ্রেড পুলের শিডিয়ুলার কীভাবে কাজ করে তা সম্পর্কে আপনাকে কিছুটা হতাশাবোধ করতে হবে। এটি একটি বড় পার্থক্য আনতে পারে তবে এটি থ্রেডের ভিতরে আপনি আসলে যা করেন তার উপর নির্ভর করে।
হ্যান্স প্যাস্যান্ট

উত্তর:


79

একটি বড় পার্থক্য আছে। টাস্কগুলি থ্রেডপুলে নির্ধারিত হয়েছে এবং অ্যাপোপিয়েট করা সত্ত্বেও সিঙ্ক্রোনাস কার্যকর করা যেতে পারে।

আপনার যদি দীর্ঘকাল ধরে চলমান ব্যাকগ্রাউন্ডের কাজ থাকে তবে আপনার সঠিক টাস্ক অপশনটি ব্যবহার করে এটি নির্দিষ্ট করা উচিত।

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


5
না এটা না। এটি কেবল কাজ শুরু করে। এটি থ্রেড পুলে টাস্কটি সজ্জিত করতে পারে বা এটি সিঙ্ক্রোনালি কার্যকর করতে পারে। টিপিএল নিজেকে থ্রেডগুলি পরিচালনা / সমঝোতা থেকে মুক্তি দেওয়ার জন্য এবং আপনার প্ল্যাটফর্মের জন্য সেরা ব্যবহার (কোর ব্যবহারের মতো)
সানোসডোল

10
এখানে TaskCreationOptions.LongRunning বিকল্পটি সর্বদা একটি অন্য থ্রেড তৈরি করবে, তবে পুরো বিষয়টিটি আপনাকে কেন অন্য থ্রেডের প্রয়োজন? যদি আপনি কেবল সমান্তরালভাবে কিছু করতে চান (টাস্ক চলাকালীন মেইন স্টেথ করেন) এটি একটি সর্বোত্তম দক্ষ পদ্ধতিতে থ্রেডের মতো সিস্টেম রিসোর্সগুলি কীভাবে ব্যবহার করতে হবে তা একটি অপ্টিমাইজড লাইব্রেরিকে সিদ্ধান্ত দেওয়া ভাল।
সানোসডোল

3
এই এমএসডিএন নিবন্ধটি কীভাবে কার্য নির্ধারিত তা বর্ণনা করে। এটি দীর্ঘস্থায়ী এবং ইনলাইনিং (সিঙ্ক্রোনাস এক্সিকিউশন) কভার করে। এমএসডিএন.মাইক্রোসফট.এইন.উস
লিবারি

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

4
@ স্মিং দুঃখিত, এই বাক্যটি খানিকটা মোটা ছিল। কাজের সিঙ্ক্রোনাস এক্সিকিউশনকে ইনলাইনিং বলে। ইউআই থ্রেড থেকে থ্রেডপুলে (ডিফল্ট সিডিউলার) কোনও কাজের সময় নির্ধারণের সময় এটি ঘটে না। এটি কেবল তখনই ঘটবে যখন অ্যাম্বিয়েন্ট শিডিয়ুলার ('TaskScheduler.Current') আপনি কল করেন এমন কোনও কাজের শিডিয়ুলারের সমান হয়। 'ওয়েট ()' অন। যেমন '.উইট ()' অবরুদ্ধ করা হচ্ছে, এটি ইউআইটিকে যেভাবেই অবরুদ্ধ করবে। সংক্ষিপ্ত: কল অপেক্ষা না করা এবং এটি একযোগে কার্যকর করা হবে না।
সানোসডোল

73

টাস্কটি আপনাকে টাস্ক এপিআইয়ের সমস্ত কল্যাণ দেয়:

  • ধারাবাহিকতা যুক্ত করা ( Task.ContinueWith)
  • একাধিক টাস্ক সম্পূর্ণ হওয়ার অপেক্ষায় (সমস্ত বা যে কোনও হয়)
  • কার্যক্রমে ত্রুটিগুলি ধরা এবং পরে তাদের জিজ্ঞাসাবাদ করা
  • ক্যাপচার বাতিল
  • সম্ভাব্য একটি রিটার্ন মান আছে
  • সি # 5 এ অপেক্ষা করুন Using
  • সময় নির্ধারণের উপর আরও ভাল নিয়ন্ত্রণ (যদি এটি দীর্ঘস্থায়ী হতে চলেছে, আপনি কাজটি তৈরি করার সময় তাই বলুন যাতে টাস্ক শিডিয়ুলার এটিকে বিবেচনায় নিতে পারে)

নোট করুন যে উভয় ক্ষেত্রেই আপনি আপনার গ্রুপটি পদ্ধতি গ্রুপ রূপান্তরগুলির সাথে কিছুটা সহজ করতে পারেন:

DataInThread = new Thread(ThreadProcedure);
// Or...
Task t = Task.Factory.StartNew(ThreadProcedure);

8
+1 টি। আমি Threadতুলনায় এটি খুব নিচু স্তরের যুক্ত করতে চাই Task(আমার কাছে একটি ব্লগ পোস্ট রয়েছে যা বিস্তারিতভাবে যায়)। গ্র্যান্ড র‌্যাপিডস ডেভডেতে আমি "রিয়েল ওয়ার্ল্ডে টাস্কগুলি ব্যবহার করে" ধরণের কথা বলছি । আলাপটিকে "থ্রেড ইজ ডেড" বলা হয়, কারণ এখন আর কোনও প্রয়োজন নেই Thread(যদি না আপনি একটি প্রয়োগ করছেন TaskScheduler)।
স্টিফেন ক্লারি 13

@ স্টেফেনক্রিয়ারি, আমি ধরে নিয়েছি যে আপনি বলতে চাইছেন Threadমারা গেছেন, যখন এটি ব্যাকগ্রাউন্ড থ্রেড হিসাবে ব্যবহৃত হচ্ছে?
ভাটা

1
@ ইবিবি: না, আমি আমার প্রথম মন্তব্যে বর্ণিত দৃ stronger় অবস্থান গ্রহণ করি। এমন কিছু Threadকরতে পারে না (বা BackgroundWorker) যা আরও মার্জিতভাবে Taskএবং উপযুক্তের সাথে করা যায় না TaskScheduler
স্টিফেন ক্লিয়ারি 21

1
@ স্টেফেনক্রিয়ারি, আপনি কীভাবে একটি উত্সর্গীকৃত থ্রেড ব্যবহার করবেন না Thread?
ভাটা

4
@ ইবিবি: "উত্সর্গীকৃত থ্রেড" আমার কাছে পরিষ্কার নয়। আপনি যদি Taskকোনও নির্দিষ্ট থ্রেডে চলতে চান তবে একটি উপযুক্ত ব্যবহার করুন TaskScheduler- যেমন AsyncContextThread,। তবে এটি সাধারণত প্রয়োজন হয় না; The SynchronizationContext, ThreadPoolএবং ConcurrentExclusiveSchedulerPairনির্ধারণ সবচেয়ে প্রোগ্রামের জন্য যথেষ্ট।
স্টিফেন ক্লিয়ারি

12

প্রথম ক্ষেত্রে আপনি থ্রেড পুলে প্রবেশের সময় আপনি কেবল একটি নতুন থ্রেড শুরু করছেন।

থ্রেড পুল কাজ ভাগ এবং রিসাইকেল থ্রেড হয়। এটি প্রতিবার নতুন থ্রেড তৈরি করার সময় কয়েক মিলিসেকেন্ড হারাতে এড়াতে সহায়তা করে।

থ্রেড পুলে প্রবেশের বিভিন্ন উপায় রয়েছে:

  • আপনার মতো টিপিএল (টাস্ক সমান্তরাল গ্রন্থাগার) দিয়ে
  • থ্রেডপুল.কুইউ ইউজার ওয়ার্কআইটিমে কল করে
  • কল করে BeginInvoke একটি প্রতিনিধি উপর
  • আপনি যখন ব্যাকগ্রাউন্ড ওয়ার্কার ব্যবহার করেন

1

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

আপনার দ্বিতীয় ব্লকের কোডটি একই কাজ করে কিন্তু কার্যনির্বাহী (টাস্ক ফ্যাক্টরি বাস্তবায়নে স্টার্টনউ পদ্ধতির মাধ্যমে প্রেক্ষাপট- যা আবার থ্রেড পুলে সঞ্চালিত হয়) থ্রেড তৈরির দায়িত্ব (প্রচ্ছন্নভাবে হস্তান্তর) এবং ড্রেজিটকে (নিখুঁতভাবে হস্তান্তর করা) দায়িত্ব দেয়।

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

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