Önsöz : Sadece bir çözüm değil, bir açıklama arıyorum. Çözümü zaten biliyorum.
Görev tabanlı Eşzamansız Kalıp (TAP), zaman uyumsuz ve beklemedeki MSDN makalelerini inceleyerek birkaç gün geçirmeme rağmen, hala bazı ince detaylar hakkında biraz kafam karıştı.
Windows Mağazası Uygulamaları için bir kaydedici yazıyorum ve hem eşzamansız hem de eşzamanlı günlük kaydını desteklemek istiyorum. Eşzamansız yöntemler TAP'ı takip eder, eşzamanlı olanlar bunları gizlemeli ve sıradan yöntemler gibi görünmeli ve çalışmalıdır.
Bu, asenkron günlüklemenin temel yöntemidir:
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);
}
Şimdi ilgili senkronize yöntem ...
Sürüm 1 :
private void WriteToLog(string text)
{
Task task = WriteToLogAsync(text);
task.Wait();
}
Bu doğru görünüyor, ancak çalışmıyor. Tüm program sonsuza dek donuyor.
Sürüm 2 :
Hmm .. Belki görev başlatılmadı?
private void WriteToLog(string text)
{
Task task = WriteToLogAsync(text);
task.Start();
task.Wait();
}
Bu atar InvalidOperationException: Start may not be called on a promise-style task.
Sürüm 3:
Hmm .. Task.RunSynchronously
kulağa umut verici geliyor.
private void WriteToLog(string text)
{
Task task = WriteToLogAsync(text);
task.RunSynchronously();
}
Bu atar InvalidOperationException: RunSynchronously may not be called on a task not bound to a delegate, such as the task returned from an asynchronous method.
Sürüm 4 (çözüm):
private void WriteToLog(string text)
{
var task = Task.Run(async () => { await WriteToLogAsync(text); });
task.Wait();
}
Bu çalışıyor. Yani, 2 ve 3 yanlış araçlardır. Peki 1? 1 ile ilgili sorun nedir ve 4 ile farkı nedir? 1'in donmasına neden olan nedir? Görev nesnesiyle ilgili bir sorun var mı? Açık olmayan bir kilitlenme var mı?