SORU
19 Mart 2013, Salı


Zaman uyumsuz/mimarlık bekliyor

Kullanıyorsanız uyumsuz/bekliyor düşük düzeyde mimarlık, gerekli "bubble up" zaman uyumsuz/bekleyen çağrılar tüm yol kadar, verimsiz beri temelde oluşturma Yeni bir iş parçacığı için her katman (zaman uyumsuz olarak çağırmak zaman uyumsuz bir fonksiyon için her bir katman ya da değil gerçekten önemli ve sadece bağımlı tercihinize?

EF içinde zaman uyumsuz yöntemleri olması için EF 6.0-alpha3 kullanıyorum.

Benim depo gibi

public class EntityRepository<E> : IRepository<E> where E : class
{
    public async virtual Task Save()
    {
        await context.SaveChangesAsync();
    }
}

Şimdi benim iş katmanı gibi

public abstract class ApplicationBCBase<E> : IEntityBC<E>
{
    public async virtual Task Save()
    {
        await repository.Save();
    }
}

Ve tabii ki benim UI benim yöntem çağrılırken aynı modeli takip ederdi.

Bu:

  1. gerekli
  2. negatif performans
  3. tercih meselesi sadece

Eğer bu projeleri/ayrı katmanlar kullanılmaz bile aynı sorular aynı sınıfta iç içe geçmiş bir yöntem arıyorum eğer için geçerlidir:

    private async Task<string> Dosomething1()
    {
        //other stuff 
        ...
        return await Dosomething2();
    }
    private async Task<string> Dosomething2()
    {
        //other stuff 
        ...
        return await Dosomething3();
    }
    private async Task<string> Dosomething3()
    {
        //other stuff 
        ...
        return await Task.Run(() => "");
    }

CEVAP
19 Mart 2013, Salı


Kullanıyorsanız uyumsuz/bekliyor düşük düzeyde mimarlık, gerekli "bubble up" zaman uyumsuz/bekleyen çağrılar tüm yol kadar, verimsiz beri temelde oluşturma Yeni bir iş parçacığı için her katman (zaman uyumsuz olarak çağırmak zaman uyumsuz bir fonksiyon için her bir katman ya da değil gerçekten önemli ve sadece bağımlı tercihinize?

Bu soru yanlış anlaşılma alanları birkaç öneriyor.

Öncelikleyokyeni bir iş parçacığı zaman uyumsuz bir işlev çağrısı her zaman oluşturun.

İkinci olarak, zaman uyumsuz bir işlevi çağırmadan olduğun için zaman uyumsuz bir yöntem bildirmek gerek yok. Eğer zaten verilen bu görevi ile mutlu iseniz, bu sadece bir yöntem bu dönüşyokzaman uyumsuz değiştirici var:

public class EntityRepository<E> : IRepository<E> where E : class
{
    public virtual Task Save()
    {
        return context.SaveChangesAsync();
    }
}

public abstract class ApplicationBCBase<E> : IEntityBC<E>
{
    public virtual Task Save()
    {
        return repository.Save();
    }
}

Budevlet bir makine çok küçük bir sebep için yaratılmış olması ile ilgili değil gibi, biraz daha etkili olabilir, ama daha da önemlisi, daha kolay.

Herhangi bir zaman uyumsuz yöntem nerede var bir tek await ifade bekleyen bir Task Task<T>, sonunda yöntemiyle daha fazla işlem, daha iyi olur yazılıyor olmadan kullanarak zaman uyumsuz/bekliyor. Bu yüzden:

public async Task<string> Foo()
{
    var bar = new Bar();
    bar.Baz();
    return await bar.Quux();
}

daha iyi olarak yazılır:

public Task<string> Foo()
{
    var bar = new Bar();
    bar.Baz();
    return bar.Quux();
}

(Teoride arayanlar için devamı ekleyebilirsiniz bu nedenle görevleri yaratılan çok küçük bir fark var, ama vakaların büyük çoğunluğu, herhangi bir fark olmayacaktır.)

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BSA

    BSA

    9 NİSAN 2012
  • DavidParody

    DavidParody

    17 EKİM 2009
  • Migs351

    Migs351

    3 HAZİRAN 2007