SORU
2 AĞUSTOS 2013, Cuma


Doğru Görev kullanın.Sadece uyumsuz-bekliyor zaman çalıştırmak ve

Görev ne zaman kullanılması doğru mimarisi hakkında ilgili görüşlerinizi sormak istiyorum.Çalıştırın. Bizim WPF UI kart her ikisi de yaşıyorum .net 4.5 app. (Caliburn Micro çerçeve ile).

Temelde (çok basitleştirilmiş kod parçacıkları) ben ne yapıyorum

public class PageViewModel : IHandle<SomeMessage>
{
   ...

   public async void Handle(SomeMessage message)
   {
      ShowLoadingAnimation();
      await this.contentLoader.LoadContentAsync();  // makes UI very laggy, but still not dead
      HideLoadingAnimation();   
   }
}

public class ContentLoader 
{
    public async Task LoadContentAsync()
    {
        await DoCpuBoundWorkAsync();
        await DoIoBoundWorkAsync();
        await DoCpuBoundWorkAsync();

        // not really sure what all I can consider as CPU bound as slowing down the UI
        await DoSomeOtherWorkAsync();  
    }
}

Makaleler/videolar/o zaman uyumsuz mutlaka bg parçacığı üzerinde çalışmıyor bekliyor biliyorum ve Task.Run(async () => ... ) bekliyor ile sarmalıyız işe başlamak için planda gördüm okudum. Zaman uyumsuz kullanarak UI engellemez bekliyor, ama hala kart her ikisi de yapıyor yani UI thread üzerinde çalışıyor.

Benim sorum Görev koymak için en iyi yerdir.Çalıştırın.

Sadece edeyim (1) dış arama bu daha az iş parçacığı olduğundan sarın .net ben mi? (2) sadece şal bağlama yöntemleri dahili Görev ile çalışan CPU.Bu diğer yerler için yeniden kullanılabilir yapar gibi mi çalışmalıyım? Burada derin bg konuları üzerinde çalışmak temel başlangıç iyi bir fikir olup olmadığından emin değilim.

(1) yumruk çözüm bu gibi görür

   public async void Handle(SomeMessage message)
   {
      ShowLoadingAnimation();
      await Task.Run(async () => await this.contentLoader.LoadContentAsync());  
      HideLoadingAnimation();   
   }

   // other methods do not use Task.Run as everything regardless if IO or CPU bound would now run in background

(2) İkinci çözüm bu gibi görür

   public async Task DoCpuBoundWorkAsync()
   {
        await Task.Run(() => {
          ...
          do lot of stuff here
          ...
          });
   }

   public async Task DoSomeOtherWorkAsync(
   {
        ... 
        not sure how to handle this methods - probably need to test one by one, if it is slowing down UI
        ...
   }

Bu mantıklı umuyoruz. Şimdiden görüşleriniz için teşekkürler.

CEVAP
2 AĞUSTOS 2013, Cuma


Bloguma: guidelines for performing work on a UI thread alınan not

  • Bir anda 50ms daha UI iş parçacığı engelleme yok.
  • Saniyede UI iş parçacığı; 1000 çok fazla ~100 devamı için zamanlayabilirsiniz.

Kullanmanız gereken iki tekniği vardır:

1) Ne zaman ConfigureAwait(false) Kullanın.

E. g., await MyAsync().ConfigureAwait(false); yerine await MyAsync();.

ConfigureAwait(false) geçerli bağlama devam etmek zorunda değilsiniz await söyler (bu durumda, "güncel içerik" "UI iş parçacığı üzerinde"). anlamına gelir Ancak, async Bu yöntem (ConfigureAwait sonra) geri kalanı için, yapamazsınız (örneğin, güncelleştirme UI elementleri) geçerli bağlamda olduğunuzu varsayar her şeyi yapar.

Daha fazla bilgi için şu Web sitesini ziyaret makalemi Best Practices in Asynchronous Programming bkz.

2) Task.Run CPU bağımlı yöntemlerini çağırmak için Kullanın.

Yeniden kullanılabilir olmasını istediğiniz herhangi bir kod (örneğin, kütüphane kod) içinde 19* *ama değil kullanmalısınız. Task.Run için kullanınArabu yöntem, bir parçası olarak değiluygulamayöntemi.

Bu yüzden sadece CPU bağımlı çalışma gibi görünecektir:

// Documentation: This method is CPU-bound.
void DoWork();

Task.Run kullanarak diyoruz ki:

await Task.Run(() => DoWork());

Yöntem bukarışımCPU bağımlı ve O-bağlı belgeler Async bir imzası olması gerektiğini işaret CPU bağımlı doğaları I/:

// Documentation: This method is CPU-bound.
Task DoWorkAsync();

Ayrıca Task.Run kısmen CPU bağımlı olduğundan () kullanarak diyoruz ki:

await Task.Run(() => DoWorkAsync());

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • jedimasterkyle

    jedimasterky

    11 ŞUBAT 2006
  • MarinaHD2001

    MarinaHD2001

    7 ŞUBAT 2009
  • Pál Zoltán Illés

    Pál Zoltán

    30 NİSAN 2007