c# - কিভাবে নিরাপদে নিরাপদভাবে#এ অপেক্ষা হিসাবে একটি Async পদ্ধতি কল




exception-handling async-await (5)

আপনি প্রথমে GetStringData একটি async পদ্ধতি তৈরি করতে বিবেচনা করুন এবং এটি MyAsyncMethod থেকে ফিরে আসা MyAsyncMethod await করুন।

আপনি যদি সম্পূর্ণরূপে নিশ্চিত হন যে আপনার MyAsyncMethod থেকে ব্যতিক্রমগুলি পরিচালনা করার প্রয়োজন MyAsyncMethod বা এটি সম্পূর্ণ হওয়ার MyAsyncMethod জানেন, তবে আপনি এটি করতে পারেন:

public string GetStringData()
{
  var _ = MyAsyncMethod();
  return "hello world";
}

বিটিডব্লিউ, এটি একটি "সাধারণ সমস্যা" নয়। কিছু কোড চালানো খুব বিরল এবং এটি সম্পন্ন করে কিনা সেটি যত্ন করে না এবং এটি সফলভাবে সমাপ্ত কিনা তা যত্ন করে না।

হালনাগাদ:

যেহেতু আপনি ASP.NET এ আছেন এবং তাড়াতাড়ি ফিরে যেতে চাইছেন, আপনি আমার ব্লগ পোস্টটি দরকারী বিষয়ে খুঁজে পেতে পারেন। যাইহোক, এএসপি.NET এর জন্য ডিজাইন করা হয়নি, এবং প্রতিক্রিয়াটি ফেরার পরে আপনার কোডটি চালানো হবে বলে কোন গ্যারান্টি নেই। ASP.NET এটি চালানোর জন্য তার যথাসাধ্য চেষ্টা করবে, তবে এটি গ্যারান্টি দেয় না।

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

আমার একটি async পদ্ধতি রয়েছে যা কোন তথ্য প্রদান করে না:

public async Task MyAsyncMethod()
{
    // do some stuff async, don't return any data
}

আমি অন্য পদ্ধতি থেকে এটি কল করছি যা কিছু তথ্য প্রদান করে:

public string GetStringData()
{
    MyAsyncMethod(); // this generates a warning and swallows exceptions
    return "hello world";
}

MyAsyncMethod() অপেক্ষা না করে এটি "একটি কারণ অপেক্ষা করছে না, কারণ কলটি শেষ হওয়ার আগে বর্তমান পদ্ধতি চলতে থাকে " ভিজ্যুয়াল স্টুডিওতে সতর্কতা। সেই সতর্কতার জন্য পৃষ্ঠাতে এটি বলে:

আপনি যদি নিশ্চিত হন যে আপনি অ্যাসিঙ্ক্রোনাস কলটি সম্পন্ন করার জন্য অপেক্ষা করতে না চান এবং যে পদ্ধতিটি কোন ব্যতিক্রম উত্থাপন করবে না সেক্ষেত্রে আপনি কেবল সতর্কতা দমন বিবেচনা করতে পারেন।

আমি নিশ্চিত যে কলটি শেষ হওয়ার জন্য অপেক্ষা করতে চাই না; আমি সময় বা প্রয়োজন নেই। কিন্তু কল ব্যতিক্রম বাড়াতে পারে

আমি এই সমস্যার মধ্যে কয়েকবার stumbled করেছি এবং আমি নিশ্চিত যে এটি একটি সাধারণ সমস্যা যা একটি সাধারণ সমাধান থাকতে হবে।

ফলাফলটি অপেক্ষা করে আমি কিভাবে নিরাপদভাবে অ্যাসাইন পদ্ধতিটি কল করব?

হালনাগাদ:

মানুষের জন্য আমি ফলাফলের অপেক্ষায় আছি, এই কোডটি আমাদের ওয়েব পরিষেবাদিতে (ASP.NET ওয়েব API) ওয়েব অনুরোধের প্রতিক্রিয়া জানাচ্ছে। UI UI প্রসঙ্গে অপেক্ষা করার জন্য UI টি থ্রেড মুক্ত রাখে, তবে অনুরোধে সাড়া দেওয়ার আগে ওয়েব অনুরোধ কলটি অপেক্ষা করার জন্য অপেক্ষা করা অপেক্ষা করবে, যার ফলে কোন কারণে প্রতিক্রিয়া বার বাড়বে।


আপনি যদি "অসकालिकভাবে" ব্যতিক্রমটি পেতে চান তবে আপনি করতে পারেন:

  MyAsyncMethod().
    ContinueWith(t => Console.WriteLine(t.Exception),
        TaskContinuationOptions.OnlyOnFaulted);

এটি আপনাকে "প্রধান" থ্রেড ছাড়া অন্য একটি থ্রেডে ব্যতিক্রমের সাথে মোকাবিলা করার অনুমতি দেবে। এর মানে হল আপনার MyAsyncMethod() কে MyAsyncMethod() কল করা থ্রেড থেকে কল করার জন্য "অপেক্ষা করতে হবে না"; কিন্তু, এখনও আপনি একটি ব্যতিক্রম সঙ্গে কিছু করার অনুমতি দেয় - কিন্তু ব্যতিক্রম যদি শুধুমাত্র ঘটে।

হালনাগাদ:

টেকনিক্যালি, আপনি await করতে অনুরূপ কিছু করতে পারে:

try
{
    await MyAsyncMethod().ConfigureAwait(false);
}
catch (Exception ex)
{
    Trace.WriteLine(ex);
}

... যা আপনাকে বিশেষভাবে try / catch (বা using ) using করতে হবে তবে এটি কার্যকর হবে তবে আমি আরও কিছু স্পষ্ট হতে ContinueWith যাব কারণ আপনি কী জানতে চান ConfigureAwait(false) মানে।


আমি মনে করি প্রশ্ন উঠেছে, কেন আপনি এই কাজ করতে হবে? C # 5.0 এ async এর কারণ হল যাতে আপনি একটি ফলাফলের জন্য অপেক্ষা করতে পারেন। এই পদ্ধতিটি আসলে অ্যাসিঙ্ক্রোনাস নয়, তবে কেবল একটি সময়ে বলা হয়েছে যাতে বর্তমান থ্রেডের সাথে খুব বেশি হস্তক্ষেপ না করা যায়।

সম্ভবত এটি একটি থ্রেড শুরু এবং এটি নিজের উপর শেষ করার জন্য ভাল হতে পারে।


এই আগুন বলা হয় এবং ভুলবেন, এবং যে জন্য একটি extension আছে।

একটি টাস্ক consume এবং এটি দিয়ে কিছু না। Async পদ্ধতিগুলির মধ্যে অ্যাসাইনস পদ্ধতিতে ফায়ার-এবং-ভুলে কলগুলির জন্য কার্যকর।

Intall nuget প্যাকেজ

ব্যবহার করুন:

MyAsyncMethod().Forget();

বার্তা loops সহ প্রযুক্তিগুলিতে (নিশ্চিত করুন যে এএসপি তাদের মধ্যে একটি হয়), আপনি লুপ অবরোধ এবং প্রক্রিয়া শেষ না হওয়া পর্যন্ত বার্তাগুলি প্রক্রিয়া করতে এবং কোডটি অবরোধ মুক্ত করতে চালিয়ে যেতে পারেন:

public void WaitForTask(Task task)
{
    DispatcherFrame frame = new DispatcherFrame();
    task.ContinueWith(t => frame.Continue = false));
    Dispatcher.PushFrame(frame);
}

এই পদ্ধতিটি শোডিয়ালগ অবরোধ করা এবং এখনও UI প্রতিক্রিয়া পালন করা অনুরূপ।





async-await