আমার পদ্ধতিটি ফিরে আসে Task
। আমি এটি শেষ না হওয়া পর্যন্ত অপেক্ষা করতে চাই। আমি কি ব্যবহার করা উচিত
.Wait()
বা .GetAwaiter().GetResult()
? তাদের মধ্যে পার্থক্য কী?
আমার পদ্ধতিটি ফিরে আসে Task
। আমি এটি শেষ না হওয়া পর্যন্ত অপেক্ষা করতে চাই। আমি কি ব্যবহার করা উচিত
.Wait()
বা .GetAwaiter().GetResult()
? তাদের মধ্যে পার্থক্য কী?
উত্তর:
উভয়ই অপারেশনের ফলাফলের জন্য একটি সংলগ্ন অপেক্ষা (এবং যদি সম্ভব হয় তবে আপনার এড়ানো উচিত)।
পার্থক্যটি মূলত ব্যতিক্রমগুলি পরিচালনা করার ক্ষেত্রে। এর সাথে Wait
, ব্যতিক্রম স্ট্যাকের ট্রেসটি আনল্যাটারড হয় এবং ব্যতিক্রমের সময় প্রকৃত স্ট্যাকের প্রতিনিধিত্ব করে, তাই যদি আপনার কাছে কোনও টুকরো কোড থাকে যা থ্রেড-পুলের থ্রেডে চালিত হয়, আপনার কাছে স্ট্যাকের মতো
ThreadPoolThread.RunTask
YourCode.SomeWork
অন্যদিকে, .GetAwaiter().GetResult()
কোডের কিছু অংশ ইউআই থ্রেডকে চালিত করে এবং কিছু থ্রেডপুল থ্রেডকে উপেক্ষা করে স্ট্যাক ট্রেসগুলি সমস্ত অ্যাসিক্রোনাস প্রসঙ্গে বিবেচনার জন্য পুনরায় কাজ করবে এবং কিছু কেবলমাত্র অ্যাসিনক্রোনাস আই / ও। সুতরাং আপনার স্ট্যাক ট্রেস আপনার কোডের মাধ্যমে একটি সুসংগত-মত পদক্ষেপ প্রতিফলিত করবে :
TheSyncMethodThatWaitsForTheAsyncMethod
YourCode.SomeAsyncMethod
SomeAsync
YourCode.SomeWork
কমপক্ষে বলতে গেলে এটি ব্যতিক্রম স্ট্যাকের ট্রেসকে অনেক বেশি দরকারী করে তোলে। আপনি দেখতে পারেন যে "এটি চালিত শারীরিক উপায়ে" পরিবর্তে আপনার আবেদনের প্রসঙ্গে কোথায় YourCode.SomeWork
ডাকা হয়েছিল।
এটি কীভাবে কাজ করে তার একটি উদাহরণ রেফারেন্স উত্সে (অ-চুক্তিবদ্ধ, অবশ্যই)।
TaskAwaiter
একটি বাস্তবায়ন বিশদ। অন্যদিকে, awaitable / awaiter প্রক্রিয়া নথিভুক্ত করা হয়, এবং ব্যবহার হাঁস-টাইপিং - GetAwaiter
হয় await
যেমন GetEnumerator
হয় foreach
বা Dispose
হয় using
। এই সমস্ত নির্দিষ্ট সিটির জন্য নির্দিষ্ট # অপেক্ষাকৃত নির্ধারিত ক্ষেত্রে সি # স্পেসিফিকেশনে সংজ্ঞায়িত করা হয়েছে - নোট যেটি Task.GetAwaiter
"অ্যাপ্লিকেশন কোডটিতে ব্যবহারের পরিবর্তে সংকলক ব্যবহারের উদ্দেশ্যে তৈরি করা হয়েছে" note তবে মুল বক্তব্যটি হ'ল উদ্দেশ্যটি হ'ল কোনওটি করা হয় await
, না হয় Wait()
না GetAwaiter().GetResult()
- তবে GetResult
আপনার প্রয়োজন হলে আপনাকে আরও ভাল স্ট্যাক দেয় gives