ASP.NET MVC'de Zaman Uyumsuz Denetleyiciler: Gerçek Avantajlar / Nasıl Elde Edildi?


12

ASP.NET MVC ( http://visualstudiomagazine.com/articles/2013/07/23/async-actions-in-aspnet-mvc-4.aspx ) adresindeki eşzamansız denetleyici yöntemleri hakkında bir makale üzerinde çalışıyorum ve sanırım Bu noktayı kaçırıyor olabilirim.

Makaleden bir örneğe çok benzeyen yazdığım bu yöntemi düşünün:

[HttpGet]
[AsyncTimeout(8000)]
[HandleError(ExceptionType = typeof(TimeoutException), View = "TimedOut")]
public async Task<ActionResult> Index(CancellationToken cancellationToken)
{
    WidgetPageViewModel model = new WidgetPageViewModel()
    {
        toAdd = new Widget()
    };
    model.all = await _repo.GetAllAsync(cancellationToken);
    return View(model);
}

Bir şeyleri anladığım gibi, çalışma zamanında işler nasıl ortaya çıkacak:

  1. Gelen HTTP isteği için bir ASP.NET iş parçacığı oluşturulur.

  2. Bu iş parçacığı (bazı gerekli ön çalışmaları yaptıktan sonra) yukarıdaki Index () yöntemime girecektir.

  3. Yürütme "bekliyor" anahtar sözcüğüne ulaşacak ve başka bir iş parçacığında veri toplama işlemini başlatacak.

  4. Özgün "ASP.NET" iş parçacığı, dönüş değeri olarak Görev sınıfının bir örneğiyle, işleyici yöntem olarak adlandırılan koda döner.

  5. İşleyici yöntemim olarak adlandırılan altyapı kodu, gerçek ActionResult nesnesini kullanması gereken bir noktaya gelene kadar (örneğin, sayfayı oluşturmak için) orijinal "ASP.NET" iş parçacığında çalışmaya devam eder.

  6. Arayan daha sonra Task.Result üyesini kullanarak bu nesneye erişecektir;

Önemsiz olarak algıladığım iki şey dışında, beklemede / eşzamansız olarak aynı şeyle karşılaştırıldığında neyi başardığını görmüyorum:

  • Arayan iş parçacığı ve bekleyen iş parçacığı bir süre paralel olarak çalışabilir (yukarıdaki # 5'in "kadar" kısmı). Benim önsezim, zaman periyodunun oldukça küçük olması. Altyapı bir denetleyici yöntemine çağırdığında, genellikle daha fazla (herhangi bir şey varsa) yapmadan önce denetleyici çağrısının gerçek ActionResult'a ihtiyacı olduğunu düşünüyorum.

  • Uzun süre çalışan eşzamansız denetleyici işlemlerinin zaman aşımı ve iptali ile ilgili bazı yararlı yeni altyapılar vardır.

Zaman uyumsuz denetleyici yöntemlerini eklemenin amacı, bu ASP.NET çalışan iş parçacıklarını aslında HTTP isteklerini yanıtlayacak şekilde serbest bırakmaktır. Bu evreler sonlu bir kaynaktır. Ne yazık ki, makalede önerilen desen aslında bu konuları korumak için nasıl hizmet görmüyorum. Ve olsa bile ve bir şekilde -ASP.NET olmayan bir iş parçacığına isteği işleme yükünü bir şekilde ortadan kaldırsa bile, bu ne yapar? HTTP isteğini işleyebilen iş parçacıkları genel olarak iş parçacıklarından çok farklı mı?


Execution will reach the "await" keyword and kick off a data acquisition process on another thread-- Şart değil. asyncbaşka bir iş parçacığı gerektirmez ... Bu bir devam. Aynı iş parçacığı üzerindeki
Robert Harvey

Daha fazla bilgi için buraya tıklayın: msdn.microsoft.com/en-us/library/hh191443.aspx
Robert Harvey

"Yürütme, beklenen anahtar kelimeye ulaşacak ve başka bir iş parçacığında veri toplama işlemini başlatacak." bunu geri aldınız: beklemek geri döndüğünde. GetAllAsync () sonucunu bir değişkene kaydetmek ve bunun yerine bunu beklemek ve daha net olup olmadığını görmek için bölmeyi deneyin.
Esben Skov Pedersen

Yanıtlar:


9

Görev Paralel Kitaplığı'nı (TPL) kullanmayan ASP.Net, bir iş parçacığı havuzundaki iş parçacığı sayısıyla aynı anda işleyebileceği istek sayısı ile sınırlıdır. TPL kullanan ASP.Net, makine işleme isteklerinin CPU / bellek / IO'su ile sınırlıdır.

Görev Paralel Kütüphanesi (TPL), iş parçacıklarını düşündüğünüz şekilde tüketmez. Görevler iş parçacığı değildir, bazı hesaplama birimlerinin etrafına sarılır. Görev zamanlayıcı, meşgul olmayan herhangi bir iş parçacığında her görevin yürütülmesinden sorumludur. Çalışma zamanında, bir görevi beklemek iş parçacığını engellemez, yalnızca yürütme durumunu park eder, böylece daha sonra devam edebilir.

Normal olarak, tek bir iş parçacığı isteği tek bir iş parçacığı tarafından işlenir ve yanıt döndürülünceye kadar o iş parçacığı havuzdan tamamen kaldırılır. TPL ile bu kısıtlamaya bağlı değilsiniz. Gelen herhangi bir istek, havuzdaki herhangi bir iş parçacığında yürütülebilen bir yanıtı hesaplamak için gereken her bir hesaplama birimi ile devam eder. Bu modelle, standart ASP.Net'ten daha fazla eşzamanlı isteği işleyebilirsiniz.


Peki ASP.NET iş parçacığı ne zaman havuza geri dönüyor? "Bekliyor" anahtar kelimesi vurulduğunda?
user1172763

async / await + TPL derleyicinin kodunuzu görev zamanlayıcı tarafından yürütülen bağımsız hesaplama birimlerine bölmesine izin verir. Görev zamanlayıcı yürütülebilecek başka görev olmadığında ve iş parçacığı kendisine verilen işi tamamladığında bir iş parçacığı kavramsal olarak havuza geri döndürülür.
mortalapeman

Bu kavramsal olarak doğrudur ve muhtemelen yararlı bir cevaptır ... ancak gerçek, iplik çevikliği nedeniyle biraz daha karmaşıktır .
John Wu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.