সমস্যাটি হ'ল আপনি নন-জেনেরিক Task
ক্লাসটি ব্যবহার করছেন , এটি কোনও ফলাফল তৈরি করার উদ্দেশ্যে নয়। সুতরাং আপনি যখন Task
অ্যাসিঙ্ক প্রতিনিধিকে পাশ করার উদাহরণটি তৈরি করবেন :
Task myTask = new Task(async () =>
... প্রতিনিধি হিসাবে বিবেচিত হয় async void
। এটি একটি async void
নয় Task
, এটির জন্য অপেক্ষা করা যায় না, এর ব্যতিক্রমটি পরিচালনা করা যায় না, এবং এটি স্ট্যাকওভারফ্লো এবং অন্য কোথাও হতাশ প্রোগ্রামারদের দ্বারা তৈরি হাজার হাজার প্রশ্নের উত্স । সমাধানটি হ'ল জেনেরিক Task<TResult>
ক্লাসটি ব্যবহার করা , কারণ আপনি একটি ফলাফল ফিরে আসতে চান এবং ফলাফলটি অন্য Task
। সুতরাং আপনাকে একটি তৈরি করতে হবে Task<Task>
:
Task<Task> myTask = new Task<Task>(async () =>
এখন যখন আপনি Start
বাইরের দিকে যান তখন Task<Task>
এটি প্রায় তাত্ক্ষণিকভাবে সম্পন্ন হবে কারণ এর কাজটি কেবল অন্তর্ তৈরি করা Task
। এরপরে আপনাকে অভ্যন্তরেরও অপেক্ষা করতে হবে Task
। এটি এটি করা যেতে পারে:
myTask.Start();
Task myInnerTask = await myTask;
await myInnerTask;
আপনার দুটি বিকল্প আছে। আপনার যদি অভ্যন্তরীণ বিষয়ে সুস্পষ্ট রেফারেন্সের প্রয়োজন না হয় Task
তবে আপনি কেবল Task<Task>
দু'বার বাইরের জন্য অপেক্ষা করতে পারেন :
await await myTask;
... বা আপনি অন্তর্নির্মিত এক্সটেনশন পদ্ধতিটি ব্যবহার করতে পারেন Unwrap
যা বাইরের এবং অভ্যন্তরীণ কার্যগুলিকে একের সাথে সংযুক্ত করে:
await myTask.Unwrap();
আপনি যখন আরও বেশি জনপ্রিয় ব্যবহার করেন তখন এই আনারপিংটি স্বয়ংক্রিয়ভাবে ঘটে Task.Run
গরম কাজগুলি তৈরি করে এমন পদ্ধতি so তাই Unwrap
আজকাল খুব সহজেই এটি ব্যবহৃত হয় না।
আপনি যদি সিদ্ধান্ত নেন যে আপনার অ্যাসিঙ্ক প্রতিনিধিকে অবশ্যই একটি ফলাফল ফেরত পাঠাতে হবে, উদাহরণস্বরূপ ক string
, তারপরে আপনার ফলাফলটি ঘোষণা করা উচিতmyTask
পাঠাতে হবে ভেরিয়েবলটি টাইপ হিসাবেTask<Task<string>>
।
দ্রষ্টব্য: আমি এর ব্যবহারকে সমর্থন করি নাTask
ঠান্ডা কাজ তৈরির জন্য কনস্ট্রাক্টর । যেহেতু একটি অনুশীলনটি সাধারণত নষ্ট হয়, কারণগুলির কারণে আমি সত্যিই জানি না, তবে সম্ভবত এটি এত কম ব্যবহৃত হয় যে এতে অন্য অজ্ঞাত ব্যবহারকারী / রক্ষণাবেক্ষণকারী / কোডটির পর্যালোচকদের অবাক করে তোলার সম্ভাবনা রয়েছে।
সাধারণ পরামর্শ: আপনি যখন কোনও পদ্ধতির তর্ক হিসাবে একটি অ্যাসিঙ্ক প্রতিনিধি সরবরাহ করছেন তখন প্রতিবার সতর্ক থাকুন। এই পদ্ধতির আদর্শভাবে একটি Func<Task>
যুক্তি (অর্থাত্ async প্রতিনিধিদের বোঝে) বা কমপক্ষে একটি Func<T>
যুক্তি (যার অর্থ কমপক্ষে উত্পন্ন উত্পন্ন করা Task
হবে তা উপেক্ষা করা হবে না) আশা করা উচিত। দুর্ভাগ্যজনক ক্ষেত্রে যে এই পদ্ধতিটি একটি গ্রহণ করে Action
, আপনার প্রতিনিধি হিসাবে বিবেচিত হবে async void
। এটি যদি আপনি চান তবে খুব কমই হয়।