2011-01-19 15 views
5

Bu [HttpPost] eylem yöntemim var: Burada/Asenkron Denetleyici Kullanabilir miyim? (ASP.NET MVC 3)

[HttpPost] 
public ActionResult AddReview(Review review) 
{ 
    repository.Add(review); 
    repository.Save(); 
    repository.UpdateSystemScoring(review.Id); // call SPROC with new Review ID. 
    return View("Success", review); 
} 

Yani, temelde bir kullanıcı bir düğmeyi tıklatır, onu veritabanına eklerim (Entity Framework 4.0 üzerinden), değişiklikleri kaydeder ve sonra saklı yordamını kimlikle çağırırım. Bu alanın ikinci son satırı olan alan.

Bu sonra yapılmalıdır gözden geçirme kaydedilir (kimlik alanı sadece bir kez Kaydet kaydedilir adlandırılır ve EF değişiklikleri devam eder), ve bir sistem çapında hesaplamasıdır.

Kullanıcı açısından'ten itibaren, bu hesaplama işleminin yapılmamasına özen göstermiyor veya olmamalıdır.

Bu prosedür 0-20 saniye arasında bir zaman alabilir. Hiçbir şey döndürmez.

Bu bir asenkron denetleyici için bir aday mı?

İncelemeyi ekleyebileceğim bir yol var ve başka bir asenkron kontrolörün uzun süreli SPROC aramasını yönetmesine izin ver, böylece kullanıcı hemen Başarı sayfasına götürülebilir mi?

(kısmen bundan utanıyor) itiraf etmeliyim: Bu, mevcut bir sistemin yeniden yazılmasıdır ve orijinal sistemde (ASP.NET Web Formları), yukarıdaki görevi gerçekleştirmek için başka bir iş parçacığı başlattım - ASP.NET MVC 3'e aynı prensip uygulanıp uygulanamayacağını merak ediyorum.

Herzaman 'ı deneyin ve ASP.NET'te çoklu iş parçacıklarını önleyin, ancak kullanıcı deneyimi # 1 önceliği ve sayfanın zaman aşımını istemiyorum.

Peki bu mümkün mü? Başka fikirleri duymaktan da mutluyum. Ayrıca - burada tetikleyiciler kullanamıyorum, gerçekten neden çok fazla ayrıntıya girmeyi istemiyorum - ama yapamam.

cevap

4

Bu görevi gerçekleştirmek için yeni bir iş parçacığı (iş parçacığı havuzundan değil) tetiklerim ve özellikle sonuçlarla ilgilenmiyorsanız hemen geri dönerler. Eşzamansız kontrolörler, zamanın çoğunu başka bir sistemin görevini tamamlamasını beklemek için harcanan durumlarda yararlıdır ve bu sistem görevi tamamladıktan sonra, uygulamanız sonucu işlemek için işaret edilir. Görevin yürütülmesi sırasında uygulamanızdan hiçbir iplik tüketilmez. Bu nedenle, bu görev, ADO.NET'te BeginRead yöntemlerinin async sürümlerini kullanarak SQL Server tarafından gerçekleştirilebilir. Sonuçları geri istiyorsan bunu kullanabilirsin. Yeni bir iş parçacığı kovmazsanız, önceki gibi iyi çalışır.

+0

Gerçekten mi? Bunu orijinal olarak önerdiğimde (sistemin orjinal versiyonunda) John Saunders tarafından çarmıha gerildim ve "ASP.NET'te okumaya" karar verdim. Ve evet - sonuç umurumda değil. SPROC hiçbir şey döndürmez - sadece verilerde değişiklik yapar. Yani - daha önce olduğu gibi bir iş parçacığı ateşlemeyi öneriyorsun? – RPM1984

+0

Ve "iplik havuzundan değil" ne demek istiyorsun? Daha önce sadece yeni bir iş parçacığı() yapıyorum, bu yöntemi ayarladım, dizi paramlarını, vb. Geçirin. – RPM1984

+0

@ RPM1984, ASP.NET hizmet istekleri için bir iş parçacığı havuzu kullanıyor. Bu havuzda önceden başlatılmış iş parçacıkları vardır ve bir istek geldiğinde ASP.NET bu havuzdan bir iş parçacığı çizer. Yeni bir konu oluşturmuyor çünkü bu pahalı olabilir. Yeni bir iş parçacığı yarattığınız için 'yeni iş parçacığı()' yapmak iyi. Ayrıca John Saunders'ın * çarmıha gerildiği * yazıya da işaret edebilir misin? –

1

Puanlama sisteminin çalışması çok uzun sürdüğü için, SQL Server veya Windows'ta zamanlanmış bir görevi kullanmanızı tavsiye ederim. Kullanıcı isteğini bilmediğinden, hemen çalıştırılmasının önemi yok.

Kimlikleri bir sıraya ekleyebilir ve her 30 dakikada bir kuyruğu işleyebilirsiniz. Aksi takdirde, derhal çalıştırılması gereken bir sebep varsa, bir asyc çağrısı yapabilir ya da saklanan pro- gramın biraz yağını düzeltebileceğinizi görebilirsiniz.

1

Ben asenkron kontrolörleri isteği bir yanıt dönmek için uzun zaman alabilir şeyler için daha fazla olduğunu düşünüyorum, ancak ana iplik bir başka iplik/işlem için bekleyen çoğu zaman geçirecekti. Bu, yanıt döndürülünceye kadar yalnızca bir ilerlemeyi göstermenin kabul edilebilir olduğu durumlarda, ana sayfa yükünden ziyade ajax çağrıları için yararlıdır.

Bu tür bir görev için ayrı bir sıraya alma sistemi kullanıyorum, ki bu daha sağlam ve çalışmak daha kolay ancak kurulumu biraz daha uzun sürüyor. ASP.net işleminde bunu gerçekten yapmanız gerekiyorsa, ayrı bir istek muhtemelen en iyi seçenek olabilir, ancak çalıştırılmaması gereken bir görev potansiyeli vardır - örneğin bağlantı koptuğunda ne olacağından emin değilim. bir zaman uyumsuz görev çalışırken, uygulama havuzu geri dönüşümleri.

+0

Sistemin mimarisine dokunmak zorunda kalmayı istemedim, bu yüzden bir kuyruk sisteminden (wcf servisi, sql server broker, vb.) Kaçınmaya çalışıyorum. – RPM1984

1

Yazdığım çok benzer bir sistem var. Bir şeyi eşzamanlı olarak yapmak yerine, her şeyi sıralarını kullanarak eşzamansız yaparız.

Action -> causes javascript request to web server 
    | 
Web server puts notification on queue 
    | 
Worker picks up message from queue and does point calculation 
    | 
At some point in future user sees points adjusted 

Bu bize kullanıcı yükü büyük miktarlarda ele ve olumsuz bizim hesaplama motoru üzerinde Etkisi oldu bu konuda endişelenmenize gerek yoktur edebilmek için izin verir. Bu aynı zamanda büyük yükümüz olduğunda daha fazla yükü daha fazla işçiye ekleyebileceğimiz ve büyük bir yükümüz olmadığında işçileri kaldırabileceğimiz anlamına gelir.