2008-12-02 13 views
8


Bir fotoğrafın yüklenmesi için kullanıcıya ihtiyacım olan bir uygulamam var. Fotoğraf çok uzun sürmemesi gereken sunucuya yüklendikten sonra, kullanıcı, "teşekkürler ... bla bla bla ..." diyerek normal bir HTML sayfası olan bir yanıtı geri almalı. Yanıtı verdikten sonra şimdi
müşteriye geri gönderilir ve mutlu yoluna gider, sunucunun bu fotoğraf üzerinde çalışmaya devam etmesini istiyorum. Ağır ve uzun zaman alacak bir şey yapması gerekiyor. Ama bu tamam, çünkü kullanıcı hiçbir şey beklemiyor. Muhtemelen farklı bir sayfada.
Bu yüzden sorum, ASP.NET ile bunu nasıl yaparım. yazıyorum uygulama ASP.NET MVC yüzdenASP.NET'e bir yanıt verdikten sonra sunucuda çalışmaya nasıl devam edebilirim? (WebForms and MVC)

//save the photo on the server 
//and send viewdata saying "thanks..." 
return View(); 
//keep doing heavy processing on the photo 

gibi bir şey hayal ediyorum içindedir Ama nasıl yapıldığını bu gerçekten değil sanırım. Ayrıca, bazen ASP.NET WebForms ile çalışıyorum, bu nasıl WebForms ile de yapılır.
Teşekkür ederiz!

cevap

5

Bu hafif günlük durum için yapın: hiçbir şekilde bu var

Action<object> d = delegate(object val) 
{ 
    // in this anonymous delegate, write code that you want to run 
    ProcessDataAndLog(); 
}; 

d.BeginInvoke(null, null, null); // this spins off the method asynchronously. 

sağlam demektir. İşlenmekte olduğunuza dair bir garantiye ihtiyacınız varsa, bir mesaj sırasını düşünmelisiniz. Bu sayede, işlemi ayrı bir makineye de yükleyebilir ve web sunucunuzu kapatmayabilirsiniz.

DÜZENLEME:

aşağıdakiler de çalışır ve belki biraz daha belirgin arkadaşlarınızı kodlayıcı etmektir. Aslında aynı, ama görünüşe göre daha hızlı ve EndInvoke() çağrısı hakkında endişelenmenize gerek yok.

System.Threading.ThreadPool.QueueUserWorkItem(
    delegate(object state) 
    { 
     // in this anonymous delegate, write code that you want to run 
     ProcessDataAndLog(); 
    }); 

Ek Okuma: The Thread Pool and Asynchronous Methods ve Asynchronous delegate vs thread pool & thread ve Does not calling EndInvoke really cause a memory leak ?

+0

Ve olası bir bellek sızıntısı ile sonuçlanır. Her zaman EndInvoke'u aramalı. – leppie

+0

Belki, ama her zaman değil. Caveat Emptor. İlk olarak, fikrini Rick Strahls blos'tan aldı http://www.west-wind.com/WebLog/posts/368975.aspx Güncel düşünme/sınama, IAsync dönüş değerini referans almazsanız, 'sızıntı' oluşmamasıdır. Temsilci bittikten sonra temizlenir. –

+0

Daha fazla okuma üzerine, buna karşı ThreadPool.QueueUserWorkItem .. 'ye tekrardan baktığımı söylüyorum, her ikisi de iş parçacığı havuzunu kullanır ve ikincisi daha hızlıyken, her ikisi de yük altında sunucuyu çökertebilir ve farklı bir yaklaşım için çağrılabilir. –

1

Yapmanız gerekeni yapmak için başka bir işlemi atlamanız gerektiği gibi görünüyor. Görüntünün işlenmesiyle ilgilenmek için bir windows hizmeti bile kurmak isteyebilirsiniz. Bir dosyanın bir yerde görünmesini beklemek üzere bekleyen bir uygulama olabilir ve iş yaptığı zaman işine gitmek için asp.net iş parçasından ayrılmaya gidebilir.

0

Hiç ASP.NET programcı değilim, ancak genellikle bunu yolu menşeli Konu Görünümü ve çıkar döndürür iken sizin için bu arka plan işlemleri yapar sunucu üzerindeki başka Konuyu başlamaktır. Eğer "ASP.NET başlangıç ​​İplik" ekstra işleme ilgilenir 2. bir süreç olması gerekir gibi görünüyor

+2

IIS işlemi geri (ve bu threadleri) birçok şartlarına bağlı olabilir - tahmin edilebilir değildir, bazıları. Bu nedenle, bir istek/yanıtla ilgili olmayan bir arka plan çalışması için iş parçacığı kullanmak iyi bir fikir değildir. –

0

ararsanız bir şey bulabilecek misin

bakınız. Orijinal sayfanızın işlemden çıkmasını sağlayabilirsiniz ya da bir klasörü yoklayan ve fotoğraf geldiğinde bunları işleyen tek başına bir uygulamanız olabilir. Bu şekilde, web sunucunuzu ve çalışan işleminizi de engellersiniz. Ben web modeliyle biraz güzel oynar Geçmişte, bunu yaptık

1

bir yolu, işleme başlıyor sorumludur ve buna bir arama için dinleyen bir "özel" sayfa/web hizmeti sahip olmaktır. Bir sayfanın eşzamansız olarak başka bir sayfaya konuşması ve ardından kullanıcı ne yapıyorsa devam etmesi oldukça kolaydır.

0

Muhtemelen sunucu üzerinde çalışan bir windows hizmeti oluşturmak ve fotoğraf işlemek için bir dolguda, bir kuyruk kullanmak.böylece o fotoğrafın gerçek işleme web sitesinden tamamen ayrıdır bu şekilde yapmak sizin

//save the photo on the server 
//Add referance in queue (possibly in database to http post that the windows service monitors with details of path to the file, output path, transformation etc.) 
//and send viewdata saying "thanks..." 
return View(); 

değiştirmek ve her tarafta konuları iplik tasarruf sağlayacaktır.

Colin G

İlgili konular