Async সিটিপি Task.WaitAll()
এবং এর মধ্যে পার্থক্য কী Task.WhenAll()
? বিভিন্ন ব্যবহারের ক্ষেত্রে চিত্রিত করতে আপনি কিছু নমুনা কোড সরবরাহ করতে পারেন?
Async সিটিপি Task.WaitAll()
এবং এর মধ্যে পার্থক্য কী Task.WhenAll()
? বিভিন্ন ব্যবহারের ক্ষেত্রে চিত্রিত করতে আপনি কিছু নমুনা কোড সরবরাহ করতে পারেন?
উত্তর:
Task.WaitAll
সবকিছু শেষ না হওয়া অবধি বর্তমান থ্রেড অবরোধ করে।
Task.WhenAll
একটি কাজ প্রদান করে যা সবকিছু শেষ না হওয়া পর্যন্ত অপেক্ষা করার ক্রিয়াকে প্রতিনিধিত্ব করে।
এর অর্থ একটি অ্যাসিঙ্ক পদ্ধতি থেকে আপনি ব্যবহার করতে পারেন:
await Task.WhenAll(tasks);
... যার অর্থ সমস্ত কিছু শেষ হয়ে গেলে আপনার পদ্ধতি অব্যাহত থাকবে, তবে আপনি যতক্ষণ না থেমে থ্রেড বেঁধে রাখবেন।
WhenAll
, তবে এটি থ্রেড ব্লক করার মতো নয়।
যদিও জোনস্কিটের উত্তরটি একটি দুর্দান্ত উপায়ের মধ্যে পার্থক্যটি ব্যাখ্যা করে সেখানে আরও একটি পার্থক্য রয়েছে: ব্যতিক্রম হ্যান্ডলিং ।
Task.WaitAll
একটি ছোঁড়ার AggregateException
যখন কাজগুলো কোন ছোঁড়ার এবং আপনি সব নিক্ষিপ্ত ব্যতিক্রম পরীক্ষা করতে পারেন। await
মধ্যে await Task.WhenAll
unwraps AggregateException
এবং 'আয়' শুধুমাত্র প্রথম ব্যতিক্রম।
নীচের প্রোগ্রামটি যখন await Task.WhenAll(taskArray)
আউটপুট দিয়ে সঞ্চালিত হয় নীচে হয়।
19/11/2016 12:18:37 AM: Task 1 started
19/11/2016 12:18:37 AM: Task 3 started
19/11/2016 12:18:37 AM: Task 2 started
Caught Exception in Main at 19/11/2016 12:18:40 AM: Task 1 throwing at 19/11/2016 12:18:38 AM
Done.
নীচের প্রোগ্রামটি যখন Task.WaitAll(taskArray)
আউটপুট দিয়ে সম্পাদিত হয় নীচে হয় ।
19/11/2016 12:19:29 AM: Task 1 started
19/11/2016 12:19:29 AM: Task 2 started
19/11/2016 12:19:29 AM: Task 3 started
Caught AggregateException in Main at 19/11/2016 12:19:32 AM: Task 1 throwing at 19/11/2016 12:19:30 AM
Caught AggregateException in Main at 19/11/2016 12:19:32 AM: Task 2 throwing at 19/11/2016 12:19:31 AM
Caught AggregateException in Main at 19/11/2016 12:19:32 AM: Task 3 throwing at 19/11/2016 12:19:32 AM
Done.
কার্যক্রম:
class MyAmazingProgram
{
public class CustomException : Exception
{
public CustomException(String message) : base(message)
{ }
}
static void WaitAndThrow(int id, int waitInMs)
{
Console.WriteLine($"{DateTime.UtcNow}: Task {id} started");
Thread.Sleep(waitInMs);
throw new CustomException($"Task {id} throwing at {DateTime.UtcNow}");
}
static void Main(string[] args)
{
Task.Run(async () =>
{
await MyAmazingMethodAsync();
}).Wait();
}
static async Task MyAmazingMethodAsync()
{
try
{
Task[] taskArray = { Task.Factory.StartNew(() => WaitAndThrow(1, 1000)),
Task.Factory.StartNew(() => WaitAndThrow(2, 2000)),
Task.Factory.StartNew(() => WaitAndThrow(3, 3000)) };
Task.WaitAll(taskArray);
//await Task.WhenAll(taskArray);
Console.WriteLine("This isn't going to happen");
}
catch (AggregateException ex)
{
foreach (var inner in ex.InnerExceptions)
{
Console.WriteLine($"Caught AggregateException in Main at {DateTime.UtcNow}: " + inner.Message);
}
}
catch (Exception ex)
{
Console.WriteLine($"Caught Exception in Main at {DateTime.UtcNow}: " + ex.Message);
}
Console.WriteLine("Done.");
Console.ReadLine();
}
}
await t1; await t2; await t3;
বনামawait Task.WhenAll(t1,t2,t3);
await
, দুটি পদ্ধতির মধ্যে পার্থক্য নয়। উভয়ই একটি প্রচার করে AggregateException
, হয় সরাসরি নিক্ষেপ করে বা কোনও সম্পত্তি ( Task.Exception
সম্পত্তি) এর মাধ্যমে।
পার্থক্যের উদাহরণ হিসাবে - যদি আপনার কোনও কাজ থাকে তবে ইউআই থ্রেড দিয়ে কিছু করে (উদাহরণস্বরূপ একটি কাজ যা স্টোরিবোর্ডে একটি অ্যানিমেশন উপস্থাপন করে) যদি আপনি Task.WaitAll()
তখন ইউআই থ্রেডটি অবরুদ্ধ করে থাকেন এবং ইউআই কখনই আপডেট হয় না। আপনি যদি ব্যবহার করেন await Task.WhenAll()
তবে ইউআই থ্রেডটি অবরুদ্ধ নয়, এবং ইউআই আপডেট করা হবে।
তারা কি করে:
পার্থক্য কি:
যা ব্যবহার করুন যখন:
WaitAll
আমি বুঝতে পারছি বলে আপনার সেই সম্ভাবনা নেই ।
Task.WaitAll
পরে কি কলটির চেয়ে আলাদা করতে পারবেন না? মানে, আপনার কাজগুলি শুরু করার পরে এটি কল করার পরিবর্তে