c# - আমি কীভাবে স্টার্টআপ.কনফিগারে অ্যাসিঙ্ক অপারেশনগুলি পরিচালনা করব?




asp.net-core async-await (2)

আমার এএসপি.এনইটি 5 অ্যাপে আমি আজুর থেকে কিছু ডেটা আমার স্টার্টআপ.কনফিগার পদ্ধতিটির অভ্যন্তরে একটি ক্যাশে লোড করতে চাই। অ্যাজুর এসডিকে একচেটিয়াভাবে অ্যাসিঙ্ক পদ্ধতি প্রকাশ করে। সাধারণত, অ্যাসিঙ্ক পদ্ধতির কলিংটি এ্যাসিঙ্ক পদ্ধতির অভ্যন্তরে অপেক্ষা করা হয়ে থাকে:

public async Task Configure(IApplicationBuilder app, IMemoryCache cache)
{
    Data dataToCache = await DataSource.LoadDataAsync();
    cache.Set("somekey", dataToCache);

    // remainder of Configure method omitted for clarity
}

যাইহোক, এএসপি.নেট 5 এর জন্য কনফিগার পদ্ধতিটি বাতিল হওয়া দরকার requires আমি একটি অ্যাসিঙ্ক অকার্যকর পদ্ধতি ব্যবহার করতে পারি, তবে আমার বুঝতে পারা যায় যে অ্যাসিঙ্ক শূন্য পদ্ধতিগুলি কেবল ইভেন্ট হ্যান্ডলারদের জন্যই ব্যবহার করা হয় ( https://msdn.microsoft.com/en-us/magazine/jj991977.aspx হিসাবে অন্য অনেকের মধ্যে )।

আমি ভাবছিলাম যে এটি করার একটি আরও ভাল উপায় হ'ল অপেক্ষা করা ছাড়াই অ্যাসিঙ্ক ফাংশনটি কল করা, প্রত্যাবর্তিত টাস্কটির জন্য অপেক্ষা করুন কল করুন, তারপরে টাস্কের মাধ্যমে ফলাফলগুলি ক্যাশে করুন es

public void Configure(IApplicationBuilder app, IMemoryCache cache)
{
    Task<Data> loadDataTask = DataSource.LoadDataAsync();
    loadDataTask.Wait();
    cache.Set("somekey", loadDataTask.Result);

    // remainder of Configure method omitted for clarity
}

স্টিফেন ওয়ালথার এই বছরের শুরুর দিকে একটি ব্লগ পোস্টে অনুরূপ পদ্ধতির ব্যবহার করেছিলেন। তবে এটি কোনও গ্রহণযোগ্য অনুশীলন হিসাবে বিবেচনা করা হলে that পদটি থেকে অস্পষ্ট। তাই কি?

যদি এটি একটি গ্রহণযোগ্য অনুশীলন হিসাবে বিবেচনা করা হয় তবে আমার - ত্রুটি পরিচালনার কি দরকার? আমার বোধগম্যতা হল যে টাস্ক.ওয়েট () অ্যাসিঙ্ক অপারেশন দ্বারা চালিত কোনও ব্যতিক্রম পুনরায় নিক্ষেপ করবে এবং অ্যাসিঙ্ক অপারেশন বাতিল করার জন্য আমি কোনও ব্যবস্থা সরবরাহ করি নি। টাস্ক.ওয়েট () কে কেবল কল করা কি যথেষ্ট?


আপনি কিছু অ্যাসিক্রোনাস কাজ করতে পারেন, তবে পদ্ধতিটি সিনক্রোনাস এবং আপনি এটি পরিবর্তন করতে পারবেন না। এর অর্থ আপনাকে অ্যাসিঙ্ক কলগুলি সম্পন্ন হওয়ার জন্য সমকালীনভাবে অপেক্ষা করা দরকার।

আপনি যদি স্টার্টআপটি এখনও শেষ না করেন তবে কোনও স্টার্টআপ পদ্ধতি থেকে ফিরে আসতে চান না, তাই না? আপনার সমাধানটি ঠিক আছে বলে মনে হচ্ছে।

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


আপনি যে ব্লগে লিঙ্ক করেছেন তার উদাহরণ কোডটি উদাহরণস্বরূপ ডেটা সহ একটি ডাটাবেস তৈরি করতে কেবল সিঙ্ক-ওভার-অ্যাসিঙ্ক ব্যবহার করেছিল; সেই কলটি কোনও প্রোডাকশন অ্যাপে উপস্থিত থাকবে না।

প্রথমত, আমি বলব যে আপনার যদি সত্যই Configure দরকার হয় অ্যাসিঙ্ক্রোনাস হওয়ার জন্য, তবে আপনার এএসপি.এনইটি টিমের কাছে একটি বিষয় উত্থাপন করা উচিত যাতে এটি তাদের রাডারে থাকে। তাদের পক্ষে এই মুহুর্তে ConfigureAsync জন্য সমর্থন যুক্ত করা খুব কঠিন হবে না (এটি প্রকাশের আগে)।

দ্বিতীয়ত, আপনি সমস্যার কয়েকটি পন্থা পেয়েছেন। আপনি task.Wait (বা আরও ভাল, task.GetAwaiter().GetResult() ব্যবহার করতে পারেন, যা কোনও ত্রুটি দেখা দিলে AggregateException task.GetAwaiter().GetResult() এড়িয়ে চলে))। অথবা, আপনি টাস্কের ফলাফলের পরিবর্তে টাস্কটি ক্যাশে করতে পারেন (যা কাজ করে যদি IMemoryCache কিছু অদ্ভুত সিরিয়ালাইজ-ইন-বাইনারি-অ্যারে-ইন-মেমরি জিনিস থাকে - আমি আপনাকে দেখছি, এর পূর্ববর্তী সংস্করণগুলি ASP.NET)।

যদি এটি একটি গ্রহণযোগ্য অনুশীলন হিসাবে বিবেচনা করা হয় তবে আমার - ত্রুটি পরিচালনার কি দরকার?

GetAwaiter().GetResult() ব্যবহার করুন GetAwaiter().GetResult() ব্যতিক্রম (যদি থাকে তবে) Configure বাইরে প্রচার করতে পারে। আমি নিশ্চিত নই যে অ্যাপ্লিকেশনটি কনফিগার করতে ব্যর্থ হলেও এএসপি.এনইটি কীভাবে প্রতিক্রিয়া জানাবে।

অ্যাসিঙ্ক অপারেশন বাতিল করার জন্য আমি কোনও প্রক্রিয়া সরবরাহ করি নি।

আপনি কীভাবে কোনও অ্যাপ্লিকেশন সেটআপ "বাতিল" করতে পারবেন তা আমি নিশ্চিত নই, সুতরাং আমি তার অংশটি নিয়ে চিন্তা করব না।





async-await