2016-03-29 17 views
0

C# içinde uyumsuz programlamada yeniyim. Async kullanmayla ilgili motivasyonum, bir grup arka plan işçisinin veya açık iş parçacığının kullanılmasına gerek kalmadan, win form uygulamalarında UI iş parçacıklarını kilitlemekten kaçınmaktır. Bu benim şu andaki anlayışımdır. Bir awaitable fonksiyon üzerindeki bekliyor amacıylaKendimi sarıcı işlevlerini yazarken async işlevini bekliyorum. Bu desen nasıl önlenir?

, çağıran işlevi zaman uyumsuz olması gerekir. Eh,

Temelde bazı araya saldırdığını
public class SomeViewModel 
{ 
    private Thing m_thing; 

    public SomeViewModel() 
    { 
    ReloadThing(); 
    } 

    public Thing Thing 
    { 
    get { 
     return m_thing; 
    } 

    protected set { 
     m_thing = value; 
     NotifyPropertyChanged(); 
    } 
    } 

    public async void ReloadThing() 
    { 
    Thing = await FetchThing(); 
    } 

    private async Task<Thing> FetchThing() 
    { 
    // entity framework code 
    return await DbSet<Things>.SingleAsync(); 
    } 
} 

Bence (Form) için bir MVVM tarzı görünümü modeline girişimi ... kendimi sürekli şu kalıbı kullanarak bulduk.

Fakat, desen sadece bu yüzden bekliyor kullanabilirsiniz zaman uyumsuz sarıcı işlevidir. Burada kullanmam gereken daha iyi bir yaklaşım var mı?

+0

FetchThing yöntemine ihtiyacınız olup olmadığını mı soruyorsunuz? Ya da her iki yöntemde async olmaktan daha kolay bir yol olup olmadığını mı merak ediyorsunuz? –

+0

Her şeyden önce sorulan soru, böyle bir görünüm modelinde verileri engellemeyen bir şekilde yüklemek için daha doğrudan bir yol olup olmadığıdır, böylece bir görünüm (kazanç formu) bu asenkron veriler tarafından desteklenen bir özelliğe bağlanabilir mi? Bu benim durumuma en özel soruyla ilgili. – Ryan

cevap

4

Her şeyden önce sorulan soru, böyle bir görünüm modelinde verileri engellemeyen bir şekilde yüklemek için daha doğrudan bir yol olup olmadığıdır, böylece bir görünüm (kazanç formu) desteklenen bir özelliğe bağlanabilir Bu asenkron verilerle mi? Bu benim durumuma en özel soruyla ilgili.

Makalemizi async data binding yararlı bulabilirsiniz. İçinde, asenkron kod güncelleme veri bağlamaları (yanı sıra hata durumlarını düzgün bir şekilde ele alma gibi) barındıran pek çok kod kodunu kaldıran Task<T> için bir veri depolayabilen sarıcı tanıtıyorum.

bu kodu güncellenmiş sürümü on GitHub olduğunu.

0

Async böyle can sıkıcı. Bir yöntem eşzamansızdır ve sizden beklemek istediğinizde, o zaman bu bir sonraki yöntemi ve bir sonraki yöntemi zorlar ve bir sonraki metot da siz aşağıdakileri belirleyene kadar async'i kullanır: a) üstüne veya b'ye ulaşana kadar bir nokta bulmak Wait() için istekli.

Ben Yanlış bir şey yaptığını sanmıyorum; Bunun dışında, örneğinizi tamamlamak için FetchThing()'a ihtiyacınız yoktur. Ama sadece noktayı göstermek için orada FetchThing varsa emin değilim. Değilse, aşağıda yapmaya ReloadThing() ile FetchThing() gövdesini birleştirmek olabilir:

public async void ReloadThing() 
{ 
    Thing = await DbSet<Things>.SingleAsync(); 
} 

Aksi halde, ne varsa bana doğru bakıyor.

+0

Bence kullanıcı497745 hedefte. Yalnızca, muhtemelen daha fazla istisnai işleme ve muhtemelen iptal etme gereksinimini destekleyecek olan async Task'a async void olarak değiştirebileceğinizi ekleyeceğim. Bir olay işleyicisi olmadıkça asla async void yazmam öğretildi. –

İlgili konular