प्रस्तावना : मैं एक स्पष्टीकरण की तलाश कर रहा हूं, न कि केवल एक समाधान की। इसका हल मुझे पहले से ही पता है।
टास्क आधारित एसिंक्रोनस पैटर्न (टीएपी), एसिंक्स और प्रतीक्षा के बारे में एमएसडीएन लेखों का अध्ययन करने में कई दिन बिताने के बावजूद, मैं अभी भी कुछ बारीक विवरणों के बारे में थोड़ा भ्रमित हूं।
मैं विंडोज स्टोर ऐप्स के लिए एक लकड़हारा लिख रहा हूं, और मैं अतुल्यकालिक और तुल्यकालिक लॉगिंग दोनों का समर्थन करना चाहता हूं। एसिंक्रोनस तरीके TAP का अनुसरण करते हैं, सिंक्रोनस को यह सब छुपाना चाहिए, और साधारण तरीकों की तरह काम करना चाहिए।
यह अतुल्यकालिक लॉगिंग की मुख्य विधि है:
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 कारण एक फ्रीज बनाता है? क्या टास्क ऑब्जेक्ट में कुछ समस्या है? क्या कोई गैर-स्पष्ट गतिरोध है?