SORU
23 Ocak 2013, ÇARŞAMBA


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
23 Ocak 2013, ÇARŞAMBA


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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • arnejann

    arnejann

    3 Kasım 2007
  • boogie2988

    boogie2988

    6 NİSAN 2006
  • Megan Parken

    Megan Parken

    19 Temmuz 2009