আমার কি 'অ্যাসিঙ্ক অকার্যকর' ইভেন্ট হ্যান্ডলারগুলি এড়ানো উচিত?


119

আমি জানি যে async voidকাজগুলি শুরু করার জন্য অগ্নি-বিস্মৃত পদ্ধতিগুলি ব্যবহার করা সাধারণত একটি খারাপ ধারণা হিসাবে বিবেচিত হয় , কারণ এখানে মুলতুবি থাকা কার্যটির কোনও ট্র্যাক নেই এবং ব্যতিক্রমগুলি পরিচালনা করা কৌশলগত কারণ এটি এই জাতীয় পদ্ধতির ভিতরে ফেলে দেওয়া হতে পারে।

আমারও কি সাধারণভাবে async voidইভেন্ট হ্যান্ডলারগুলি এড়ানো উচিত ? উদাহরণ স্বরূপ,

private async void Form_Load(object sender, System.EventArgs e)
{
        await Task.Delay(2000); // do async work
        // ...
} 

আমি এটি আবার লিখতে পারি:

Task onFormLoadTask = null; // track the task, can implement cancellation

private void Form_Load(object sender, System.EventArgs e)
{
        this.onFormLoadTask = OnFormLoadTaskAsync(sender, e);
} 

private async Task OnFormLoadTaskAsync(object sender, System.EventArgs e)
{
        await Task.Delay(2000); // do async work
        // ...
} 

সম্ভাব্য পুনরায় প্রবেশের পাশাপাশি অ্যাসিঙ্ক ইভেন্ট হ্যান্ডলারের জন্য জলের নীচে শিলাগুলি কী কী?


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

পুনরায় পুনর্বিবেচনা ঘটবে হ্যান্ডলারের দ্বারা অ্যাসিঙ্ক্রোনাস অপারেশনের কারণে এবং নিজেই অ্যাসিঙ্ক-অপেক্ষার ব্যবহারের দ্বারা নয়।
পাওলো মোরগাদো

উত্তর:


153

নির্দেশিকাটি হ'ল ইভেন্ট হ্যান্ডলারের ক্ষেত্রে ব্যবহৃত হওয়া async void ব্যতীত এড়ানো উচিত , তাই ইভেন্ট হ্যান্ডলারের সাহায্যে ব্যবহার async voidকরা ঠিক।

এটি বলেছিল, ইউনিট পরীক্ষার কারণে আমি প্রায়শই সমস্ত async voidপদ্ধতির যুক্তি খুঁজে বের করতে চাই । যেমন,

public async Task OnFormLoadAsync(object sender, EventArgs e)
{
  await Task.Delay(2000);
  ...
}

private async void Form_Load(object sender, EventArgs e)
{
  await OnFormLoadAsync(sender, e);
}

আমি কৌতুহলী ... আপনি কেবল Form_Loadঅ্যাক্সেস পরিবর্তন না করার কোনও কারণ আছে public? দেখে মনে হচ্ছে কোডটি সেভাবে কম ভার্বোস হবে।
ইন্টএক্সএক্স

ওহো, কিছু মনে করবেন না ... ভিবার এখানে সি # পড়ার চেষ্টা করছে ... আমি কেবল ফিরে যাওয়ার ধরণটি লক্ষ্য করেছি OnFormLoadAsync। আমি এখন দেখছি যে এটি একটি সহজ কৌশল করে তোলে। ধন্যবাদ।
ইন্টএক্সএক্স

যা যা বলেছিল, আপনি কি এখানে দেখতে এবং মতামত জানাতে পারেন ? ধন্যবাদ!
ইন্টেক্সএক্স

2
@ অ্যালেক্সহপও'কনোর: Handledপতাকাটি সমকালীনভাবে সেট করতে হবে; asyncইভেন্টটি পরিচালনা করা হয় কি না সে সম্পর্কে সিদ্ধান্ত নেওয়ার জন্য এটি ব্যবহার করা সম্ভব নয়।
স্টিফেন ক্লিয়ারি

2
@ অ্যালেক্সহপও'কনোনার: আমি যখন ডাব্লুপিএফ অ্যাপ্লিকেশনটির সাথে কাজ করেছি অনেকদিন হয়েছে, তবে আমি অতীতের মতো সমাধান ব্যবহার করেছি। অর্থাৎ, ICommand.Executeপদ্ধতিটি তৈরি করুন async void; আমি এই গ্রহণযোগ্য বিবেচনা যেহেতু ICommand.Executeহয় কথাটি একটি ইভেন্ট হ্যান্ডলার।
স্টিফেন ক্লিয়ারি

50

আমারও সাধারণত অ্যাসিঙ্ক অকার্যকর ইভেন্ট হ্যান্ডলারগুলি এড়ানো উচিত?

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

এখন, যদি আপনাকে কোনও কারণে কার্যটি ট্র্যাক করার প্রয়োজন হয় তবে আপনি যে কৌশলটি বর্ণনা করেছেন তা পুরোপুরি যুক্তিসঙ্গত।


6

হ্যাঁ, সাধারণত ইভেন্ট হ্যান্ডলারদের অ্যাসিঙ্ক অকার্যকর একমাত্র ক্ষেত্রে। আপনি যদি এটি সম্পর্কে আরও জানতে চান তবে আপনি এখানে চ্যানেল 9 এ একটি দুর্দান্ত ভিডিও দেখতে পারেন

The only case where this kind of fire-and-forget is appropriate is in top-level event-handlers. Every other async method in your code should return "async Task".

এখানে লিঙ্কটি


' শীর্ষ-স্তরের ইভেন্ট হ্যান্ডলারগুলি ' একটি গুরুত্বপূর্ণ ইঙ্গিত। নিম্ন স্তরের ইভেন্ট হ্যান্ডলারে অ্যাসিঙ্ক শূন্য ইভেন্ট ইভেন্ট হ্যান্ডলার ব্যবহার করার সময় এটি ধরা পড়ে না ব্যতিক্রমগুলির সাথে বিশাল সমস্যা তৈরি করতে পারে।
পোর্টিকাস

ভিডিও লিঙ্কটির জন্য ধন্যবাদ, খুব দরকারী
lsp

5

আপনি যদি রিশ্যার্পার ব্যবহার করেন তবে একটি নিখরচায় প্রস্তাবিত এক্সটেনশন আপনার পক্ষে সহায়ক হতে পারে। এটি "async অকার্যকর" পদ্ধতিগুলি বিশ্লেষণ করে এবং অনুপযুক্ত ব্যবহার করার সময় হাইলাইটগুলি। এক্সটেনশনটি অ্যাসিঙ্ক শূন্যতার বিভিন্ন ব্যবহারকে আলাদা করতে পারে এবং এখানে বর্ণিত বরাদ্দকৃত দ্রুত সমাধানগুলি সরবরাহ করতে পারে: প্রস্তাবিত-এক্সটেনশন উইকি

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