ভূমিকা : আমি একটি সমাধান খুঁজছি, কেবল একটি সমাধান নয়। সমাধানটি আমি ইতিমধ্যে জানি।
টাস্ক-ভিত্তিক অ্যাসিনক্রোনাস প্যাটার্ন (টিএপি), এমসডিএন সম্পর্কিত নিবন্ধগুলি অ্যাসিঙ্ক এবং অপেক্ষা করার জন্য বেশ কয়েক দিন ব্যয় করেও আমি আরও কিছু সূক্ষ্ম বিবরণ নিয়ে এখনও কিছুটা বিভ্রান্ত।
আমি উইন্ডোজ স্টোর অ্যাপ্লিকেশনগুলির জন্য একটি লগার লিখছি, এবং আমি উভয় অ্যাসিনক্রোনাস এবং সিঙ্ক্রোনাস লগিং সমর্থন করতে চাই। অ্যাসিঙ্ক্রোনাস পদ্ধতিগুলি ট্যাপ অনুসরণ করে, সিঙ্ক্রোনাসগুলিকে এই সমস্তটি লুকিয়ে রাখা উচিত এবং সাধারণ পদ্ধতির মতো দেখতে এবং কাজ করা উচিত।
এটি অ্যাসিনক্রোনাস লগিংয়ের মূল পদ্ধতি:
private async Task WriteToLogAsync(string text)
{
StorageFolder folder = ApplicationData.Current.LocalFolder;
StorageFile file = await folder.CreateFileAsync("log.log",
CreationCollisionOption.OpenIfExists);
await FileIO.AppendTextAsync(file, text,
Windows.Storage.Streams.UnicodeEncoding.Utf8);
}
এখন সম্পর্কিত সিঙ্ক্রোনাস পদ্ধতি ...
সংস্করণ 1 :
private void WriteToLog(string text)
{
Task task = WriteToLogAsync(text);
task.Wait();
}
এটি সঠিক দেখাচ্ছে তবে এটি কার্যকর হয় না। পুরো প্রোগ্রামটি চিরকালের জন্য হিমশীতল।
সংস্করণ 2 :
হুম .. টাস্ক শুরু হতেই পারে না?
private void WriteToLog(string text)
{
Task task = WriteToLogAsync(text);
task.Start();
task.Wait();
}
এই ছুড়ে ফেলে InvalidOperationException: Start may not be called on a promise-style task.
সংস্করণ 3:
হুম .. Task.RunSynchronously
আশাব্যঞ্জক শোনাচ্ছে।
private void WriteToLog(string text)
{
Task task = WriteToLogAsync(text);
task.RunSynchronously();
}
এই ছুড়ে ফেলে InvalidOperationException: RunSynchronously may not be called on a task not bound to a delegate, such as the task returned from an asynchronous method.
সংস্করণ 4 (সমাধান):
private void WriteToLog(string text)
{
var task = Task.Run(async () => { await WriteToLogAsync(text); });
task.Wait();
}
এইটা কাজ করে. সুতরাং, 2 এবং 3 টি ভুল সরঞ্জাম। কিন্তু 1? 1 এর সাথে কী হয়েছে এবং 4 এর পার্থক্য কী? কী কারণে 1 হিমায়িত হয়ে যায়? টাস্ক অবজেক্টে কিছু সমস্যা আছে? একটি অ-সুস্পষ্ট অচলাবস্থা আছে?