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:
Gelen HTTP isteği için bir ASP.NET iş parçacığı oluşturulur.
Bu iş parçacığı (bazı gerekli ön çalışmaları yaptıktan sonra) yukarıdaki Index () yöntemime girecektir.
Yürütme "bekliyor" anahtar sözcüğüne ulaşacak ve başka bir iş parçacığında veri toplama işlemini başlatacak.
Ö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.
İş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.
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.async
başka bir iş parçacığı gerektirmez ... Bu bir devam. Aynı iş parçacığı üzerindeki