আমাকে আবার এই ব্যতিক্রমটি (তার স্ট্যাক ট্রেস সহ) নিক্ষেপ করার আগে asyncএকটি catchব্লকে একটি পদ্ধতি কল করতে হবে :
try
{
// Do something
}
catch
{
// <- Clean things here with async methods
throw;
}
তবে দুর্ভাগ্যক্রমে আপনি awaitএকটি catchবা finallyব্লক ব্যবহার করতে পারবেন না । আমি শিখেছি কারণ সংকলকটির কোনও নির্দেশ নেই যা catchআপনার awaitনির্দেশের পরে বা এর মতো কিছু কার্যকর করার জন্য কোনও ব্লকে ফিরে যেতে পারে ...
আমি Task.Wait()প্রতিস্থাপনের জন্য ব্যবহার করার চেষ্টা করেছি awaitএবং আমি একটি অচলাবস্থা পেয়েছি। আমি কীভাবে এড়াতে পারি এবং এই সাইটটি পেয়েছি তা ওয়েবে অনুসন্ধান করেছি ।
যেহেতু আমি asyncপদ্ধতিগুলি পরিবর্তন করতে পারি না এবং তারা কী ব্যবহার করে তা আমি জানি না, তাই আমি ConfigureAwait(false)এই পদ্ধতিগুলি তৈরি করেছি যা Func<Task>একবার ভিন্ন থ্রেডে (অচলাবস্থা এড়াতে) আসার পরে অ্যাসিঙ্ক পদ্ধতি শুরু করে এবং এর সমাপ্তির জন্য অপেক্ষা করে:
public static void AwaitTaskSync(Func<Task> action)
{
Task.Run(async () => await action().ConfigureAwait(false)).Wait();
}
public static TResult AwaitTaskSync<TResult>(Func<Task<TResult>> action)
{
return Task.Run(async () => await action().ConfigureAwait(false)).Result;
}
public static void AwaitSync(Func<IAsyncAction> action)
{
AwaitTaskSync(() => action().AsTask());
}
public static TResult AwaitSync<TResult>(Func<IAsyncOperation<TResult>> action)
{
return AwaitTaskSync(() => action().AsTask());
}
সুতরাং আমার প্রশ্নগুলি: আপনি কি মনে করেন যে এই কোডটি ঠিক আছে?
অবশ্যই, যদি আপনার কিছু বর্ধিততা থাকে বা আরও ভাল পদ্ধতির বিষয়টি জানেন তবে আমি শুনছি! :)
awaitC # 6.0 থেকে প্রকৃতপক্ষে ক্যাচ ব্লকে ব্যবহার করার অনুমতি রয়েছে (নীচে আমার উত্তর দেখুন)