.ওয়েট () বনাম .গেটওয়েটার ()। গেটআরসাল্ট () এর মধ্যে পার্থক্য কী?


89

আমার পদ্ধতিটি ফিরে আসে Task। আমি এটি শেষ না হওয়া পর্যন্ত অপেক্ষা করতে চাই। আমি কি ব্যবহার করা উচিত .Wait()বা .GetAwaiter().GetResult()? তাদের মধ্যে পার্থক্য কী?

উত্তর:


110

উভয়ই অপারেশনের ফলাফলের জন্য একটি সংলগ্ন অপেক্ষা (এবং যদি সম্ভব হয় তবে আপনার এড়ানো উচিত)।

পার্থক্যটি মূলত ব্যতিক্রমগুলি পরিচালনা করার ক্ষেত্রে। এর সাথে Wait, ব্যতিক্রম স্ট্যাকের ট্রেসটি আনল্যাটারড হয় এবং ব্যতিক্রমের সময় প্রকৃত স্ট্যাকের প্রতিনিধিত্ব করে, তাই যদি আপনার কাছে কোনও টুকরো কোড থাকে যা থ্রেড-পুলের থ্রেডে চালিত হয়, আপনার কাছে স্ট্যাকের মতো

ThreadPoolThread.RunTask
YourCode.SomeWork

অন্যদিকে, .GetAwaiter().GetResult()কোডের কিছু অংশ ইউআই থ্রেডকে চালিত করে এবং কিছু থ্রেডপুল থ্রেডকে উপেক্ষা করে স্ট্যাক ট্রেসগুলি সমস্ত অ্যাসিক্রোনাস প্রসঙ্গে বিবেচনার জন্য পুনরায় কাজ করবে এবং কিছু কেবলমাত্র অ্যাসিনক্রোনাস আই / ও। সুতরাং আপনার স্ট্যাক ট্রেস আপনার কোডের মাধ্যমে একটি সুসংগত-মত পদক্ষেপ প্রতিফলিত করবে :

TheSyncMethodThatWaitsForTheAsyncMethod
YourCode.SomeAsyncMethod
SomeAsync
YourCode.SomeWork

কমপক্ষে বলতে গেলে এটি ব্যতিক্রম স্ট্যাকের ট্রেসকে অনেক বেশি দরকারী করে তোলে। আপনি দেখতে পারেন যে "এটি চালিত শারীরিক উপায়ে" পরিবর্তে আপনার আবেদনের প্রসঙ্গে কোথায় YourCode.SomeWorkডাকা হয়েছিল।

এটি কীভাবে কাজ করে তার একটি উদাহরণ রেফারেন্স উত্সে (অ-চুক্তিবদ্ধ, অবশ্যই)।


6
Task.GetAwaiter () একটি TaskAwaiter প্রদান করে । তবে, TaskAwaiter.GetResult () এর জন্য ডকটি পরামর্শ দেয়: "এই API টি পণ্যের অবকাঠামো সমর্থন করে এবং আপনার কোড থেকে সরাসরি ব্যবহার করার উদ্দেশ্যে নয়" " আপনি মন্তব্য করতে পারেন?
ডেভিডআরআর

24
@ ডেভিডআরআর সম্পূর্ণরূপে TaskAwaiterএকটি বাস্তবায়ন বিশদ। অন্যদিকে, awaitable / awaiter প্রক্রিয়া নথিভুক্ত করা হয়, এবং ব্যবহার হাঁস-টাইপিং - GetAwaiterহয় awaitযেমন GetEnumeratorহয় foreachবা Disposeহয় using। এই সমস্ত নির্দিষ্ট সিটির জন্য নির্দিষ্ট # অপেক্ষাকৃত নির্ধারিত ক্ষেত্রে সি # স্পেসিফিকেশনে সংজ্ঞায়িত করা হয়েছে - নোট যেটি Task.GetAwaiter"অ্যাপ্লিকেশন কোডটিতে ব্যবহারের পরিবর্তে সংকলক ব্যবহারের উদ্দেশ্যে তৈরি করা হয়েছে" note তবে মুল বক্তব্যটি হ'ল উদ্দেশ্যটি হ'ল কোনওটি করা হয় await, না হয় Wait()না GetAwaiter().GetResult()- তবে GetResultআপনার প্রয়োজন হলে আপনাকে আরও ভাল স্ট্যাক দেয় gives
লুয়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.