অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং কোড বেসের মাধ্যমে "বৃদ্ধি" করে। এটি একটি জম্বি ভাইরাসের সাথে তুলনা করা হয়েছে । সবচেয়ে ভাল সমাধান হ'ল এটিকে বাড়তে দেওয়া, তবে কখনও কখনও এটি সম্ভব হয় না।
আংশিক- অ্যাসিনক্রোনাস কোড বেসের সাথে ডিল করার জন্য আমি আমার নিতো.অ্যাসেকেক্স গ্রন্থাগারে কয়েকটি প্রকার লিখেছি । যদিও প্রতিটি পরিস্থিতিতে কার্যকর হয় এমন কোনও সমাধান নেই।
সমাধান এ
আপনার যদি একটি সাধারণ অ্যাসিনক্রোনাস পদ্ধতি থাকে যা এর প্রসঙ্গে পুনরায় সিঙ্ক্রোনাইজ করার প্রয়োজন হয় না, তবে আপনি ব্যবহার করতে পারেন Task.WaitAndUnwrapException:
var task = MyAsyncMethod();
var result = task.WaitAndUnwrapException();
আপনি না ব্যবহার চানTask.Wait বা Task.Resultকারণ তারা ব্যতিক্রমগুলি মুড়ে ফেলে AggregateException।
এই সমাধানটি কেবল তখনই উপযুক্ত যদি MyAsyncMethodএর প্রসঙ্গে সিঙ্ক্রোনাইজ না করে। অন্য কথায়, প্রতিটিawait ইন এর MyAsyncMethodসাথে শেষ হওয়া উচিত ConfigureAwait(false)। এর অর্থ এটি কোনও UI উপাদান আপডেট করতে বা ASP.NET অনুরোধ প্রসঙ্গে অ্যাক্সেস করতে পারে না।
সমাধান বি
যদি MyAsyncMethodএর প্রসঙ্গে আবার সিঙ্ক্রোনাইজ করার দরকার হয় তবে আপনি AsyncContext.RunTaskনেস্টেড প্রসঙ্গটি সরবরাহ করতে ব্যবহার করতে সক্ষম হতে পারেন :
var result = AsyncContext.RunTask(MyAsyncMethod).Result;
* আপডেট 4/14/2014: গ্রন্থাগারের আরও সাম্প্রতিক সংস্করণগুলিতে এপিআই নীচে রয়েছে:
var result = AsyncContext.Run(MyAsyncMethod);
(এটি ব্যবহার করা ঠিক আছে Task.Result এই উদাহরণে কারণ ব্যতিক্রমগুলি RunTaskপ্রচার করবে Task)।
AsyncContext.RunTaskপরিবর্তে আপনার প্রয়োজন হতে পারেTask.WaitAndUnwrapException হ'ল উইনফোর্ডস / ডাব্লুপিএফ / এসএল / এএসপি.নেটে ঘটে যাওয়া বরং একটি সূক্ষ্ম অচলাবস্থা সম্ভাবনা:
- একটি সিঙ্ক্রোনাস পদ্ধতি একটি এসিঙ্ক পদ্ধতিকে কল করে, এটি প্রাপ্ত করে
Task ।
- সিঙ্ক্রোনাস পদ্ধতিটি একটি অবরুদ্ধ অপেক্ষা করে
Task ।
asyncপদ্ধতি ব্যবহারawait ছাড়া ConfigureAwait।
Taskএই অবস্থায় সম্পন্ন করতে পারবেন না কারণ এটি শুধুমাত্র সমাপ্ত যখন asyncপদ্ধতি সমাপ্ত হয়; asyncপদ্ধতি সম্পন্ন করতে পারবে না এটা তার ধারাবাহিকতা নির্দিষ্ট সময় নির্ধারণের জন্য চেষ্টা করছে কারণSynchronizationContext , এবং WinForms / WPF / SL বিভাগ: / ASP.NET ধারাবাহিকতা কারণ সমকালীন পদ্ধতি ইতিমধ্যে যে প্রেক্ষাপটে চলমান চালানোর জন্য অনুমতি দেয় না।
এটি প্রতিটি কারণেই যতটা সম্ভব ConfigureAwait(false)প্রতিটি asyncপদ্ধতির মধ্যে ব্যবহার করা ভাল ধারণা ।
সমাধান সি
AsyncContext.RunTaskপ্রতিটি দৃশ্যে কাজ করবে না। উদাহরণস্বরূপ, যদি asyncপদ্ধতিটি এমন কোনও কিছুটির জন্য অপেক্ষা করে যার জন্য একটি ইউআই ইভেন্টের প্রয়োজন হয়, তবে আপনি নেস্টেড প্রসঙ্গটি দিয়েও অচল। asyncসেক্ষেত্রে আপনি থ্রেড পুলে পদ্ধতিটি শুরু করতে পারেন :
var task = Task.Run(async () => await MyAsyncMethod());
var result = task.WaitAndUnwrapException();
তবে এই সমাধানটির জন্য MyAsyncMethodথ্রেড পুলের প্রসঙ্গে কাজ করা দরকার will সুতরাং এটি ইউআই উপাদানগুলি আপডেট করতে বা এএসপি.নেট অনুরোধ প্রসঙ্গে অ্যাক্সেস করতে পারে না। এবং যে ক্ষেত্রে, ভাল হিসাবে আপনি যোগ করতে পারেন ConfigureAwait(false)তারawait বিবৃতিতে পারেন এবং সমাধান এ ব্যবহার করতে পারেন
আপডেট, 2019-05-01: বর্তমান "সর্বনিম্ন-সবচেয়ে খারাপ অভ্যাস" এখানে একটি এমএসডিএন নিবন্ধে রয়েছে ।