PrevTask.Wait () কি চালিয়ে যাওয়া (টাস্ক লাইব্রেরি থেকে) ব্যবহারের পরামর্শ দেওয়া হচ্ছে?


88

সুতরাং আমাকে সম্প্রতি জানানো হয়েছিল যে আমি কীভাবে আমার .ContinueWith ব্যবহার করছি সেগুলি ব্যবহার করার উপযুক্ত উপায় ছিল না। ইন্টারনেটে এখনও এর প্রমাণ খুঁজে পাইনি তাই আমি আপনাকে ছেলেদের জিজ্ঞাসা করব এবং উত্তরটি কী তা দেখব। আমি কীভাবে ব্যবহার করি তার একটি উদাহরণ এখানে।

public Task DoSomething()
{
    return Task.Factory.StartNew(() =>
    {
        Console.WriteLine("Step 1");
    })
    .ContinueWith((prevTask) =>
    {
        Console.WriteLine("Step 2");
    })
    .ContinueWith((prevTask) =>
    {
        Console.WriteLine("Step 3");
    });
}

এখন আমি জানি এটি একটি সাধারণ উদাহরণ এবং এটি খুব দ্রুত চলবে, তবে কেবল প্রতিটি কাজটি আরও দীর্ঘতর কাজ করবে বলে ধরে নিন। সুতরাং, আমাকে যা বলা হয়েছিল তা হল .ContinueWith, আপনাকে prevTask.Wait () বলতে হবে; অন্যথায় আপনি পূর্ববর্তী কাজ শেষ হওয়ার আগে কাজ করতে পারতেন। এটা কি সম্ভব? আমি ধরে নিয়েছিলাম যে আমার দ্বিতীয় এবং তৃতীয় কার্যটি কেবলমাত্র তাদের পূর্ববর্তী টাস্ক শেষ হওয়ার পরে চলবে।

কোডটি কীভাবে লিখতে হবে তা আমাকে বলা হয়েছিল:

public Task DoSomething()
{
    return Task.Factory.StartNew(() =>
    {
        Console.WriteLine("Step 1");
    })
    .ContinueWith((prevTask) =>
    {
        prevTask.Wait();
        Console.WriteLine("Step 2");
    })
    .ContinueWith((prevTask) =>
    {
        prevTask.Wait();
        Console.WriteLine("Step 3");
    });
}

উত্তর:


115

এহহ .... আমার মনে হয় বর্তমানের উত্তরগুলির মধ্যে কিছু অনুপস্থিত: ব্যতিক্রমগুলি দিয়ে কী ঘটে?

Waitআপনি একটি ধারাবাহিকতায় কল করার একমাত্র কারণ হ'ল এটি ধারাবাহিকতায় পূর্বসূরীর থেকে সম্ভাব্য ব্যতিক্রম পর্যবেক্ষণ করা। আপনি Resultযদি কোনও ক্ষেত্রে অ্যাক্সেস করেন Task<T>এবং ম্যানুয়ালি Exceptionসম্পত্তিটি অ্যাক্সেস করেন তবে একই পর্যবেক্ষণটি ঘটবে । সত্যি বলতে গেলে, আমি কল করব না Waitবা অ্যাক্সেস করব না Resultকারণ যদি এর ব্যতিক্রম হয় তবে আপনি এটি পুনরায় বাড়ানোর জন্য মূল্য পরিশোধ করবেন যা অপ্রয়োজনীয় ওভারহেড। পরিবর্তে আপনি কেবল IsFaultedপূর্ববর্তী সম্পত্তি থেকে পরীক্ষা করতে পারেন Task। বিকল্পভাবে আপনি একাধিক ভাইবাল ধারাবাহিকতায় শৃঙ্খলাবদ্ধ করে কাঁটাযুক্ত ওয়ার্কফ্লো তৈরি করতে পারেন যা কেবলমাত্র সাফল্য বা ব্যর্থতার উপর ভিত্তি করে আগুন জ্বালিয়ে দেয় TaskContinuationOptions.OnlyOnRanToCompletionএবংTaskContinuationOptions.OnlyOnFaulted

এখন, ধারাবাহিকতায় পূর্বেরটি ব্যতিক্রমটি পর্যবেক্ষণ করা প্রয়োজন নয়, তবে "স্টেপ 1" ব্যর্থ হলে আপনি আপনার ওয়ার্কফ্লোটি এগিয়ে যেতে চাইবেন না। সেক্ষেত্রে : TaskContinuationOptions.NotOnFaultedআপনার ContinueWithকলগুলিতে নির্দিষ্ট করে দেওয়া ধারাবাহিকতা যুক্তিকে এমনকি গুলি চালানো থেকে বিরত রাখবে।

মনে রাখবেন যে, যদি আপনার নিজের ধারাবাহিকতাগুলি ব্যতিক্রমটি পর্যবেক্ষণ না করে, তবে যে ব্যক্তি এই সামগ্রিক কর্মপ্রবাহটি সম্পূর্ণ করতে অপেক্ষা করছে, তিনিই এটি পর্যবেক্ষণ করতে পারবেন। উভয় ক্ষেত্রেই তারা করছেন Waitউপর ing Taskমূল প্রজেক্টের বা নিজেদের ধারাবাহিকতা নেভিগেশন tacked আছে যখন জানতে এটা সম্পূর্ণ। যদি এটি পরে হয় তবে তাদের ধারাবাহিকতার জন্য পূর্বোক্ত পর্যবেক্ষণ যুক্তি ব্যবহার করা প্রয়োজন।


4
শেষ পর্যন্ত কেউ সঠিক উত্তর দেয়। @ ট্র্যাভিগুয় 9 অনুগ্রহ করে এই @ ড্র্রুমার্শ উত্তরটি পড়ুন এবং আরও পড়ুনTaskContinuationOptions
জ্যাস্পার

4
দুর্দান্ত উত্তর, আমি সন্ধান করছিলাম "মনে রাখবেন যে, যদি আপনার নিজের ধারাবাহিকতাগুলি ব্যতিক্রমটি পর্যবেক্ষণ করে না, তবে যে ব্যক্তি এই সামগ্রিক কর্মপ্রবাহের জন্য সম্পূর্ণরূপে অপেক্ষা করছেন তিনিই সেটিকে পর্যবেক্ষণ করবেন" " একটি প্রশ্ন যদিও আপনার কাজটি অপেক্ষা করা হয় না, তখন ডিফল্ট ওয়েটার কে? (এর উত্তর খুঁজে পাওয়া যায়নি)
থিবল্ট ডি

20

আপনি এটি সঠিকভাবে ব্যবহার করছেন।

অবিচ্ছিন্নভাবে কার্যকর করে এমন ধারাবাহিকতা তৈরি করে লক্ষ্য টাস্ক সম্পূর্ণ হওয়ার পরে ।

উৎস: টাস্ক.সামগ্রীবিধি পদ্ধতি (এমএসডিএন হিসাবে পদক্ষেপ)

ফোন করা আছে prevTask.Wait()প্রতিটি Task.ContinueWithঅনুরোধে অযৌক্তিক যুক্তির পুনরাবৃত্তি করার এক অদ্ভুত পদ্ধতির মতো বলে মনে হয় - অর্থাত্ "সুপার ডুপার নিশ্চিত" হওয়ার জন্য কিছু করা কারণ আপনি নির্দিষ্ট কিছু কোড কী করেন তা আপনি আসলে বুঝতে পারেন না। শুধু নিক্ষেপ করার জন্য নুলের জন্য পরীক্ষা করাArgumentNullException যেখানে ফেলে দেওয়া হয়েছে সেখানে ।

সুতরাং, না, যে আপনাকে এটিকে ভুল বলেছে এবং সম্ভবত তা কেন Task.ContinueWithবিদ্যমান তা বুঝতে পারে না ।


16

তোমাকে সেটা কে বললো?

এমএসডিএন উদ্ধৃত :

লক্ষ্য টাস্ক সম্পূর্ণ হওয়ার পরে অবিচ্ছিন্নভাবে কার্যকর করে এমন একটি ধারাবাহিকতা তৈরি করে।

এছাড়াও, পূর্ববর্তী কাজটি সম্পন্ন হওয়ার অপেক্ষায় না থাকলে চালিয়ে যাওয়ার উদ্দেশ্য কী হবে ?

এমনকি আপনি নিজে এটি পরীক্ষা করতে পারেন:

Task.Factory.StartNew(() =>
    {
        Console.WriteLine("Step 1");
        Thread.Sleep(2000);
    })
    .ContinueWith((prevTask) =>
    {
        Console.WriteLine("I waited step 1 to be completed!");
    })
    .ContinueWith((prevTask) =>
    {
        Console.WriteLine("Step 3");
    });

5

থেকে দুটিই MSDN উপরTask.Continuewith

প্রত্যাশিত টাস্কটি বর্তমান টাস্কটি শেষ না হওয়া পর্যন্ত কার্যকর করার জন্য নির্ধারিত হবে না। যদি ধারাবাহিকতা বিভাগগুলির পরামিতিগুলির মাধ্যমে নির্দিষ্ট মানদণ্ডগুলি পূরণ না করা হয় তবে ধারাবাহিকতার পরিবর্তে ধারাবাহিকতা বাতিল করা হবে।

আমি মনে করি আপনি প্রথম উদাহরণে কাজ করার জন্য এটি যেভাবে প্রত্যাশা করছেন তা হ'ল সঠিক উপায়।


2

আপনি টাস্ক.ফ্যাক্টরি.স্টার্টনিউয়ের পরিবর্তে টাস্ক.রুন ব্যবহারের বিষয়টি বিবেচনা করতে পারেন।

স্টিফেন ক্লিয়ারির ব্লগ পোস্ট এবং স্টিফেন টুবের পোস্ট যা তিনি উল্লেখ করেছেন পার্থক্যগুলি ব্যাখ্যা করে। এই উত্তরে একটি আলোচনাও রয়েছে ।


4
ডাউনটোটেড কারণ এটি আসল প্রশ্নের সমাধান করে না। এটি কিছু মান যোগ করে, তবে একটি মন্তব্য হওয়া উচিত।
সিনায়েস্টিক 21

0

অ্যাক্সেস করে Task.Resultআপনি আসলে একই ধরণের যুক্তি করছেনtask.wait


হ্যাঁ. আমরা অপেক্ষা () পদ্ধতি এড়াতে পারি। তবে এটি কেবল ফলাফলের কাজগুলিতেই কাজ করে, যেমন টাস্ক <
বিউল

ডাউনটোটেড কারণ এটি আসল প্রশ্নের সমাধান করে না। এটি কিছু মান যোগ করে, তবে একটি মন্তব্য হওয়া উচিত।
সিনায়েস্টিক 21

0

ইতিমধ্যে অনেকে যা বলেছে তা পুনরায় বলব, prevTask.Wait() এটি অপ্রয়োজনীয়

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

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