Eşzamanlı olarak zaman uyumsuz bir işlem için beklemek, ve Beklemek niye yok() program burada dondurma
ÖnsözBir açıklama değil, sadece bir çözüm arıyorum. Ben zaten çözümü biliyorum.
Birkaç gün Görev tabanlı zaman Uyumsuz Deseni hakkında MSDN makaleleri okuyan (TAP), uyumsuz ve bekliyor geçirmiş olmasına rağmen, hala biraz daha ince bazı ayrıntılar hakkında kafam karıştı.
Windows Mağazası Uygulamaları için bir logger yazıyorum, hem de asenkron ve senkron günlük destek istiyorum. Zaman uyumsuz yöntemleri DOKUNUN, senkron olanlar bütün bunları saklayıp, bak ve sıradan bir yöntem gibi çalışmalı izleyin.
Bu asenkron çekirdek günlüğü yöntemi
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 senkron yöntemi...
Sürüm 1:
private void WriteToLog(string text)
{
Task task = WriteToLogAsync(text);
task.Wait();
}
Bu doğru görünüyor, ama çalışmıyor. Tüm program sonsuza dek donuyor.
Sürüm 2:
.. Belki iş değildi başladı?
private void WriteToLog(string text)
{
Task task = WriteToLogAsync(text);
task.Start();
task.Wait();
}
Bu InvalidOperationException: Start may not be called on a promise-style task. atar
Sürüm 3:
.. Task.RunSynchronously Hmm kulaÄŸa hoÅŸ geliyor.
private void WriteToLog(string text)
{
Task task = WriteToLogAsync(text);
task.RunSynchronously();
}
Bu InvalidOperationException: RunSynchronously may not be called on a task not bound to a delegate, such as the task returned from an asynchronous method. atar
Sürüm 4 (çözümü):
private void WriteToLog(string text)
{
var task = Task.Run(async () => { await WriteToLogAsync(text); });
task.Wait();
}
Bu çalışıyor. , 2 ve 3 yanlış araçlardır. Ama 1? 1 nesi var ve 4 fark nedir? 1 donmasına sebep ne yapar? Görev nesnesi bir sorun mu vardı? Çok açık olmayan bir kilitlenme var mı?
Anlamama yardım et lütfen.
CEVAP
Zaman uyumsuz yöntemi içinde await UI iş parçacığı için geri dönmeye çalışıyor.
UI iş parçacığı tamamlamak için tüm görev bekliyor meşgul olduğu için, bir kilitlenme var.
Task.Run() zaman uyumsuz çağrı taşıma sorunu çözer.
Zaman uyumsuz çağrı şimdi iş parçacığı havuzu iş parçacığı üzerinde çalıştığı için, UI iş parçacığı için geri gelmek değil, ve bu yüzden her şeyi çalışır.
Alternatif olarak, iç operasyon iş parçacığı havuzu yerine UI iş parçacığı geri dön, tamamen çıkmaz önleme yapmak için bekleyen önce StartAsTask().ConfigureAwait(false) diyebilirsin.
http://ermau.com/avoiding-callbacks-to-the-ui-thread-with-async-and-winrt/ bkz

Ne zaman uyumsuz bir Görev<T> yö...
Zaman uyumsuz olarak Görev<T> za...
Nasıl bitirmek için zaman uyumsuz olar...
Nasıl komut çıkmak için beklemek zaman...
'Görev arasındaki fark ne./Beklem...