টাস্কের জন্য কী ব্যবহার। সি # তে << ফলাফল>


189

সি # এবং টিপিএলে ( টাস্ক সমান্তরাল গ্রন্থাগার ) Taskক্লাসটি একটি চলমান কাজকে উপস্থাপন করে যা টি টাইপের মান তৈরি করে।

আমি জানতে চাই যে টাস্ক.ফর্মরেসাল্ট পদ্ধতিটির কী প্রয়োজন ?

এটি: এমন একটি দৃশ্যে যেখানে আপনার হাতে ইতিমধ্যে উত্পাদিত মান রয়েছে, এটিকে আবার কোনও টাস্কে মোড়ানোর দরকার কী?

কেবল মনে মনে আসে যে এটি কোনও কার্য উদাহরণ গ্রহণ করার জন্য অন্যান্য পদ্ধতির জন্য কিছু অ্যাডাপ্টার হিসাবে ব্যবহৃত হয়।


4
এটি কি আপনাকে সাহায্য করে? এমএসডিএন.মাইক্রোসফট.এইন
লিসার /hh228607.aspx

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

41
আমার মনে হয় গুগল আমাকে এসও এনে দেয় এবং এসও আমাকে গুগলে যেতে বলে। এটি একটি বিজ্ঞপ্তি রেফারেন্স :)
Gmail ব্যবহারকারী

উত্তর:


257

দুটি সাধারণ ব্যবহারের ঘটনা আমি খুঁজে পেয়েছি:

  1. আপনি যখন এমন একটি ইন্টারফেস প্রয়োগ করছেন যা অ্যাসিঙ্ক্রোনাস কলারকে মঞ্জুরি দেয় তবে আপনার বাস্তবায়ন সিঙ্ক্রোনাস।
  2. যখন আপনি পরীক্ষার জন্য অ্যাসিক্রোনাস কোড টি স্টাবিং / বিদ্রূপ করছেন।

6
# 1 এর জন্য একটি ভাল কেস একটি ওয়েব পরিষেবা। আপনার কাছে একটি সিঙ্ক্রোনাস পরিষেবা পদ্ধতি থাকতে পারে যা প্রত্যাবর্তন করবে Task.FromResultএবং ক্লায়েন্ট যা I / O নেটওয়ার্কের জন্য অবিচ্ছিন্নভাবে অপেক্ষা করে। আপনি ক্লায়েন্ট / সার্ভার ব্যবহার করে একই ইন্টারফেস ভাগ করতে পারেন ChannelFactory
নেলসন রোদারমেল 25:25

2
উদাহরণস্বরূপ চ্যালেঞ্জএন্সিঙ্ক পদ্ধতি। ডাব্লুটিএফ কি এমএসের ডিজাইনার ছিলেন? এই পদ্ধতির কোনও টাস্ক ফিরিয়ে দেওয়ার কোনও কারণ নেই। এবং এমএস থেকে প্রাপ্ত সমস্ত নমুনা কোডটিতে কেবলই ফরাসারসাল্ট (0) রয়েছে। আশা করি সংকলকটি এটিকে অপ্টিমাইজ করার জন্য যথেষ্ট স্মার্ট, এবং আসলে একটি নতুন থ্রেড তৈরি করবে না এবং ঠিক এখনই এটি মেরে ফেলবে!
জন হেন্কেল

14
@ জনহেন্কেল: ওউইন স্থলভাগ থেকে অ্যাসিঙ্ক-বান্ধব হওয়ার জন্য তৈরি করা হয়েছে। ইন্টারফেস এবং বেস ক্লাসগুলি প্রায়শই অ্যাসিঙ্ক স্বাক্ষর ব্যবহার করে কারণ এটি প্রয়োগকে কেবল অ্যাসিঙ্ক হওয়ার অনুমতি দেয় ( বাহিনী নয় )। সুতরাং এটি অনুরূপ IEnumerable<T>থেকে আহরিত IDisposable- এটা দেয় গণনীয় নিষ্পত্তিযোগ্য সম্পদ, না আছে বাহিনীর এটি। না হয় FromResult, asyncনা awaitথ্রেড স্প্যান করবে না ।
স্টিফেন ক্লিয়ারি

4
@ স্টেফেনক্রিয়ারি এইচএমএইচএম, এটি ব্যাখ্যা করার জন্য ধন্যবাদ thanks আমি ধরে নিয়েছিলাম যে অপেক্ষার প্রস্ফুটিত হবে, কিন্তু আমি এটি চেষ্টা করেছি এবং দেখছি এটি হয় না। কেবল টাস্ক.রুন করে। অতএব, এক্স = টাস্কের জন্য অপেক্ষা করুন rom থেকে ফলাফল (0); x = 0 বলার সমতুল্য; এটি বিভ্রান্তিকর, তবে জানা ভাল!
জন হেন্কেল

4
@ ওলিগি: আই / ও অপারেশনগুলির জন্য, এটিকে অবিচ্ছিন্নভাবে কার্যকর করা সবচেয়ে ভাল সমাধান, তবে কখনও কখনও আপনার পছন্দ হয় না। এছাড়াও, কখনও কখনও আপনি এটি সমকালীনভাবে প্রয়োগ করতে পারেন (উদাহরণস্বরূপ, একটি ক্যাশেড ফলাফল, মানটি ক্যাশে না করা থাকলে অ্যাসিঙ্ক্রোনাস বাস্তবায়নের পিছনে পড়ে)। আরও সাধারণভাবে, একটি Taskপুনর্বিবেচিত পদ্ধতির অর্থ "অ্যাসিনক্রোনাস হতে পারে"। তাই কখনও কখনও পদ্ধতিগুলিকে পুরোপুরি জেনে একটি অ্যাসিনক্রোনাস স্বাক্ষর দেওয়া হয় যে কিছু বাস্তবায়ন সিঙ্ক্রোনাস হবে (যেমন, অ্যাসিঙ্ক NetworkStreamহওয়া উচিত, তবে MemoryStreamসিঙ্ক হওয়া উচিত)।
স্টিফেন ক্লিয়ারি

50

একটি উদাহরণ একটি পদ্ধতি যা ক্যাশে ব্যবহার করে। যদি ফলাফলটি ইতিমধ্যে গণনা করা হয় তবে আপনি মান (ব্যবহার করে Task.FromResult) দিয়ে একটি সমাপ্ত টাস্কটি ফিরিয়ে দিতে পারেন । যদি তা না হয়, তবে আপনি এগিয়ে যান এবং চলমান কাজের প্রতিনিধিত্ব করে একটি টাস্ক ফিরিয়ে দেন।

ক্যাশের উদাহরণ: প্রাক-গণিত মানগুলির জন্য টাস্ক.ফর্মআরসাল্ট ব্যবহার করে ক্যাশে উদাহরণ


এবং সমাপ্ত কাজগুলি যেমন যেগুলি থেকে ফিরে এসেছে Task.FromResultতা ক্যাশে করা যায়।
পাওলো মোরগাদো

1
@ পাওলো: পুরো টাস্ক অবজেক্টটিকে স্মৃতিতে রাখা কেবলমাত্র ফলাফলটি ক্যাশে করার চেয়ে অনেক বেশি অপব্যয়যুক্ত বলে মনে হয়।
বেন ভয়েগট

2
আশা করুন "মান কার্যগুলি" ইতিমধ্যে ক্যাশে হয়েছে। আমি ঠিক কোনটি প্রত্যাহার না, কিন্তু আমি মনে করি Task.FromResult(0), Task.FromResult(1), Task.FromResult(false)এবং Task.FromResult(true)ক্যাশে করা হয়। আপনার নেটওয়ার্ক অ্যাক্সেসের জন্য কোনও কাজ ক্যাশে করার কথা নয় তবে ফলাফলটি পুরোপুরি ঠিক আছে। আপনি প্রতিবার মানটি ফেরত দেওয়ার জন্য একটি তৈরি করতে পছন্দ করবেন?
পাওলো মোরগাদো

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

1
আমি এটাকে এখন পেলাম. উত্তরের শব্দটি কিছুটা বিভ্রান্তিকর ছিল। টাস্কের নিজস্ব "ক্যাশে" ব্যবস্থা নেই। তবে যদি আপনি ... বলুন .... ফাইলগুলি ডাউনলোড করার জন্য টাস্ক <ফাইল> GetFileAync () লিখেছেন তবে আপনি তাত্ক্ষণিকভাবে Task.FromResult (ক্যাশেড ফাইল) ব্যবহার করে ক্যাশে থাকা কোনও ফাইল এবং তাত্ক্ষণিকভাবে ফিরিয়ে দিতে পারবেন থ্রেড সুইচ না থাকায় সময় সাশ্রয় করে সিঙ্ক্রোনসিভভাবে চলবে।
Brain2000

31

আপনি যখন অ্যাসিঙ্ক কীওয়ার্ডটি ব্যবহার না করে অপেক্ষাযোগ্য পদ্ধতি তৈরি করতে চান তখন এটি ব্যবহার করুন। আমি এই উদাহরণটি পেয়েছি:

public class TextResult : IHttpActionResult
{
    string _value;
    HttpRequestMessage _request;

    public TextResult(string value, HttpRequestMessage request)
    {
        _value = value;
        _request = request;
    }
    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        var response = new HttpResponseMessage()
        {
            Content = new StringContent(_value),
            RequestMessage = _request
        };
        return Task.FromResult(response);
    }
}

এখানে আপনি ওয়েব অ্যাপি অ্যাকশনে ব্যবহার করার জন্য IHttpActionResult ইন্টারফেসটির নিজস্ব বাস্তবায়ন তৈরি করছেন। এক্সিকিউটিএসিঙ্ক পদ্ধতিটি অ্যাসিনক্রোনাস হিসাবে প্রত্যাশা করা হয় তবে আপনাকে এ্যাসঙ্ক কীওয়ার্ডটি অ্যাসিঙ্ক্রোনাস এবং অপেক্ষাকৃতর জন্য ব্যবহার করতে হবে না। যেহেতু আপনার ইতিমধ্যে ফলাফল রয়েছে এবং কোনও কিছুর জন্য অপেক্ষা করার দরকার নেই এটি টাস্ক.ফর্মআরসাল্ট ব্যবহার করা আরও ভাল।


20

এমএসডিএন থেকে:

এই পদ্ধতিটি কার্যকর যখন আপনি একটি অ্যাসিক্রোনাস অপারেশন সম্পাদন করেন যা কোনও টাস্ক অবজেক্ট দেয় এবং সেই টাস্ক অবজেক্টের ফলাফল ইতিমধ্যে গণনা করা হয়।

http://msdn.microsoft.com/en-us/library/hh228607.aspx


4

আপনি যখন অ্যাসিক্রোনাস অপারেশন করতে চান তখন টাস্ক.ফর্মআরসাল্ট ব্যবহার করুন তবে কখনও কখনও ফলাফলটি সিঙ্ক্রোনালি হাতে পাওয়া যায়। আপনি এখানে একটি ভাল নমুনা খুঁজে পেতে পারেন http://msdn.microsoft.com/en-us/library/hh228607.aspx


আপনার ভাল নমুনায়, ফলাফলটি সিঙ্ক্রোনসিভভাবে হাতে নেই, ক্রিয়াকলাপটি সমস্ত অ্যাসিঙ্ক হয়, এটি Task.FromResultপূর্বে ক্যাশেড অ্যাসিঙ্ক ফলাফল পেতে ব্যবহৃত হয়।
রডরিগো রেইস

1

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

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