2016-03-21 24 views
5

Bir Windows 10 (UWP) Uygulaması içinde MvvmCross ve AsyncEx kitaplığını kullanıyorum. Bir ViewModel C# kodu async yönteminde engelleme

, bir INotifyTaskCompletion özelliğine sahip (1) ViewModel (2)

(2) ', bir çağrı, bir zaman uyumsuz kütüphanesi yöntemi bir zaman uyumsuz yönteme kablolu kadar olan bir hızda geçer:

  • Çekler yerel önbellek
  • Yüklemeler veriler uyumsuz
  • cache
verileri eklerÖnbelleğe alma kodu eşzamansız yapılamaz ve bu nedenle kitaplık yöntemi hem engelleme hem de eşzamansız kod içerir.

S. Kullanıcı arabirimini engellemenin en iyi yolu nedir?

Eşzamansız kodda engellenmemesi için Stephen Cleary'dan anladım ve kitaplık yöntemlerinde Task.Run'u kullanmamayı anlıyorum. Öyleyse yapmak zorundayım….

Önbelleğe alma çağrılarını (2) içine taşıyın örn.

  • Kullanım Task.Run (kontrol etmek önbellek)
  • Çağrı kütüphane yöntemi tekrar uyumsuz
  • Kullanım Task.Run (veri önbelleğe)?

Daha iyi bir yolu var mı?

+1

Paylaşabileceğiniz bir kod var mı? –

+0

"Daha iyi" tanımınıza bağlıdır. Önbellek kodunu değiştiremezseniz ve uyumsuz/bekletme kullanmak istiyorsanız, önbellek kodu için 'Task.Run()' ifadesinin kullanılması "doğru" olur. – Jcl

cevap

3

Tamamen senkronize kodunuz varsa, dönüşü olmayan bir hale getirmek ve uyumsuz hale getirmek istiyorsanız, async/await kullanmak istediğiniz tek seçenek Task.Run() kullanmaktır. gibi

şey:

public async Task<T> MyMethod() 
{ 
    T result = await Task.Run(() => CheckCacheOnSyncMethodICantChange()); 
    if(result != null) 
    { 
    result = await MyLibraryMethodThatReturnsATask(); 
    await Task.Run(() => AddToCacheOnSyncMethodICantChange(result)); 
    } 
    return result; 
} 

Tamam olmalı.

+0

Teşekkür ederim. Cevabınızı doğru olarak işaretleyeceğim. – Howard

+0

Cevabımma rağmen, ve özel durumunuz için, bir önbellek hızlı olmalı (kullanmanızın nedeni budur) ... Önbellek yöntemlerini eşzamansız hale getirmeniz gerektiğinden emin misiniz? – Jcl

+1

Verileri bir dosya tabanlı veritabanında önbelleğe almak için SQLite.net kullanıyorum. Bu iş CPU olmayan bağlı olduğundan, UI iş parçacığı engellemeden yapmak istiyorum. Bir şey mi özledim? – Howard