টাস্ক.স্টার্ট (), টাস্ক.রুন () এবং টাস্ক.ফ্যাক্টরি.স্টার্টনিউ () এর ব্যবহার সম্পর্কিত


143

আমি টিপিএল ব্যবহার সম্পর্কে 3 টি রুটিন দেখেছি যা একই কাজ করে; কোডটি এখানে:

public static void Main()
{
    Thread.CurrentThread.Name = "Main";

    // Create a task and supply a user delegate by using a lambda expression. 
    Task taskA = new Task( () => Console.WriteLine("Hello from taskA."));
    // Start the task.
    taskA.Start();

    // Output a message from the calling thread.
    Console.WriteLine("Hello from thread '{0}'.", 
                  Thread.CurrentThread.Name);
    taskA.Wait();
}

public static void Main()
{
    Thread.CurrentThread.Name = "Main";

    // Define and run the task.
    Task taskA = Task.Run( () => Console.WriteLine("Hello from taskA."));

    // Output a message from the calling thread.
    Console.WriteLine("Hello from thread '{0}'.", 
                      Thread.CurrentThread.Name);
    taskA.Wait();
}

public static void Main()
{
    Thread.CurrentThread.Name = "Main";

    // Better: Create and start the task in one operation. 
    Task taskA = Task.Factory.StartNew(() => Console.WriteLine("Hello from taskA."));

    // Output a message from the calling thread.
    Console.WriteLine("Hello from thread '{0}'.", 
                    Thread.CurrentThread.Name);

    taskA.Wait();                  
}

আমি ঠিক বুঝতে পারছিলাম না কেন মাইক্রোসফট কারণ তারা সব কাজ TPL কাজ চালানোর জন্য একই 3 বিভিন্ন উপায়ে দেয়: Task.Start(), Task.Run()এবং Task.Factory.StartNew()

আমাকে বলুন Task.Start(), Task.Run()এবং Task.Factory.StartNew()সমস্ত কি একই উদ্দেশ্যে ব্যবহৃত হয় বা তাদের আলাদা তাত্পর্য রয়েছে?

কখন কোন ব্যবহার করা উচিত Task.Start(), কখন ব্যবহার করা Task.Run()উচিত এবং কখন ব্যবহার করা উচিত Task.Factory.StartNew()?

উদাহরণস্বরূপ দুর্দান্ত বিবরণে দৃশ্যের ভিত্তিতে তাদের আসল ব্যবহার বুঝতে দয়া করে আমাকে ধন্যবাদ, ধন্যবাদ।


এখানে একটি পুরানো নিবন্ধটি ব্যাখ্যা করা হচ্ছে যে এখানে এবং এখানে নবীনদের জন্যTask.Run - সম্ভবত এটি আপনার প্রশ্নের জবাব দেবে;)
কার্সটেন

Task.Startপ্রকৃতপক্ষে কোথায় দরকারী তা এখানে একটি উদাহরণ ।
নাসেরটিও

উত্তর:


171

Task.RunTask.Factory.StartNewনির্দিষ্ট সুরক্ষিত যুক্তি সহ একটি সংক্ষিপ্তকরণ :

Task.Factory.StartNew(
    action, 
    CancellationToken.None, 
    TaskCreationOptions.DenyChildAttach, 
    TaskScheduler.Default);

এটি .Net 4.5 এ যুক্ত করা হয়েছিল যাতে ক্রমবর্ধমান ঘন ঘন ব্যবহার asyncএবং অফলোডিং কাজের সাথে সহায়তা করতে সহায়তা করে ThreadPool

Task.Factory.StartNew(। নেট 4.0 এ টিপিএল যুক্ত হয়েছে) অনেক বেশি শক্তিশালী। আপনার কেবল এটি Task.Runপর্যাপ্ত না হলে এটি ব্যবহার করা উচিত , উদাহরণস্বরূপ আপনি যখন ব্যবহার করতে চান TaskCreationOptions.LongRunning(যদিও এটি প্রতিনিধি হিসাবে অ্যাসিঙ্ক থাকে তখন এটি অপ্রয়োজনীয় my এটি আমার ব্লগে আরও রয়েছে: লং রানিং কার্যের জন্য অকেজো । আরো Task.Factory.StartNewমধ্যে Task.Run Task.Factory.StartNew বনাম

আপনি কখনও এটির জন্য Taskকল করুন Start()না যদি না আপনি এটি করার জন্য খুব ভাল কারণ খুঁজে পান। এটি কেবলমাত্র তখনই ব্যবহার করা উচিত যখন আপনার কিছু অংশ রয়েছে যাতে কাজগুলি তৈরি করতে হবে তবে সেগুলি নির্ধারণ না করে এবং অন্য অংশটি তৈরি না করে শিডিয়ুল করে। এটি প্রায়শই উপযুক্ত সমাধান নয় এবং এটি বিপজ্জনক হতে পারে। আরো "Task.Factory.StartNew" বনাম "নতুন টাস্ক (...)। শুরু"

উপসংহারে, বেশিরভাগ ব্যবহার করুন Task.Run, Task.Factory.StartNewআপনার অবশ্যই ব্যবহার করুন এবং কখনই ব্যবহার করবেন না Start


5
আপনি বলেছিলেন "কখনই কোনও টাস্ক তৈরি করবেন না এবং স্টার্ট () কে কল করুন না আমাকে কোনও ভাল লেখায় পুনর্নির্দেশ করুন যা টাস্ক.স্টার্ট () এর কারণ হতে পারে তা দেখায়। আমার বিশদ প্রয়োজন কারণ আপনি তা এড়াতে বলেছিলেন। উত্তর দেওয়ার জন্য ধন্যবাদ.
মৌ


1
@ Task.Startবেশিরভাগ ক্ষেত্রে উত্তরাধিকার সূত্রে আপনার স্থান রয়েছে।
যুবাল ইতজককভ

1
@ মৌ এটি অকার্যকর কারণ এটি কেবল একবার ডাকা হয়েছে তা নিশ্চিত করার জন্য এটি সুসংগতকরণ প্রয়োজন। অন্য বিকল্পগুলি না।
i3arnon

2
@ মোঃ আপনার সম্ভবত পোস্টটি পড়তে হবে যা ব্লগস.এমএসএন
বি /

2

সংক্ষিপ্ত উত্তর :

যদি আপনি নেস্টেড বাচ্চাদের কাজগুলি ব্যবহার না করে থাকেন এবং সর্বদা আপনার কাজগুলি থ্রেড পুলে কার্যকর করতে চান তবে এটি ব্যবহার করা ভাল Task.Run

দীর্ঘ উত্তর:

Task.Runএবং Task.Factory.StartNewউভয়ই টাস্ক অবজেক্ট তৈরি এবং সময়সূচী করার জন্য সহায়তা সরবরাহ করে যাতে আমাদের কোনও Taskকল তৈরি করার প্রয়োজন হয় নাStart()

Task.Run(action);

এর সমতুল্য:

Task.Factory.StartNew(action, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);

এবং

Task.Factory.StartNew(action);

এর সমতুল্য:

Task.Factory.StartNew(action, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Current);

Task.Runব্যবহার করে TaskCreationOptions.DenyChildAttachযার অর্থ হ'ল বাচ্চাদের কার্যগুলি পিতামাতার সাথে সংযুক্ত করা যায় না এবং এটি ব্যবহার করে TaskScheduler.Defaultযার অর্থ থ্রেড পুলের উপর যে কাজগুলি চালানো হয় সেগুলি সর্বদা কাজ চালাতে ব্যবহৃত হবে।

Task.Factory.StartNewব্যবহারসমূহ TaskScheduler.Currentযা বর্তমান থ্রেডের নির্ধারণকারী মানে এটা হতে পারে TaskScheduler.Defaultতবে সব সময় নয়।

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