2009-08-23 22 views
26

ASP.NET MVC web uygulamasında arka plan işleme sıralarını nasıl uygularım? Çoğu veri değiştiğinde, güncellemelerin vb. Hemen görünür olması gerekirken, kendi hızıyla ilgilenecek daha düşük öncelikli bir arka plan sürecine teslim etmek istediğim gerçek zamanlı işlemeye ihtiyaç duymayan başka güncellemeler de vardır. . Örnek olarak ASP.NET MVC Web Uygulamasında Sıra Tabanlı Arkaplan İşleme

, StackOverflow'daki rozeti ödül sistemini alır. Genellikle size bir rozet vereceğiniz belirli bir eylemde bulunabilirsiniz, ancak asıl 'ödül' daha sonra gerçekleşir (genellikle 10 dakika ile birkaç saat sonra). Bunun, SO'nun çalışmalarının kazandığında hemen rozetleri ödüllendirmesi için kritik olmadığı için ayrı bir arka plan süreci ile yapıldığını düşünüyorum.

Bu yüzden, görevleri ayrı ayrı yürütebileceğim bir tür kuyruk sistemi oluşturmaya çalışıyorum (bir süreç() yöntemine sahip olan ve her zaman ayrı bir işlem tarafından gerçekleştirilecek olan ITask arabirimini uygulayan bir şey).

Böyle bir sistemi uygulamaya nasıl başlarım? Fikirler/İpucu/Örnek Kod?

Teşekkür ederiz! (Hatta gerekirse)

cevap

20

, Windows Hizmetleri ve MSMQ onlarla iletişim kurmaya.

- Düzenle

Biraz genişletmek için.

Sen ne yapmak istediğinize bağlı olarak birkaç hizmetleri oluşturmak ve hepsini istediğini yapmak, çeşitli uyku seviyelerinin sonsuz iplik çalıştırmak gerekir. Daha sonra veritabanını uygun şekilde güncellerler ve istemci tarafında herhangi bir şey yapmak zorunda kalmazsınız.

Sen dolayısıyla onlar yönetici dinlemek dair bir MSMQ'YU olabilir, bakış bir yönetici açısından onlarla etkileşim isteyebilirler

komutları. Uygulamanıza bağlı olarak, bunları bir nedenle yeniden başlatmanız veya muhtemelen yapmak istediği şeyin bir çalışmasını 'zorlamanız' gerekebilir.

Yani onu (System.Messaging ad) yapmak için bir MSMQ Özel Kuyruk kullanacağız. MSMQ ile ilgili dikkat edilmesi gereken başlıca noktalardan biri, mesajın < 4meg olması gerektiğidir. Dolayısıyla, büyük nesne grafikleri göndermeyi düşünüyorsanız, önce bir dosyaya serileştirin ve sadece dosya adını gönderin.

MSMQ oldukça güzel.

{guid}\1 

Başka bir şey en azından sürüm 2.0 (çalışmaz: Bazı eğlenceli bir nedenle, korelasyon kimliği biçiminde olmalıdır, gerek, ama eğer bir 'Korelasyon Kimliği' dayalı göndermek olabilir çerçevenin kodu değişmiş olabilir).

- düzenle

Örnek, istendiği gibi:

using System.Messaging; 

... 


MessageQueue queue = new MessageQueue(".\\Private$\\yourqueue"); 
queue.Formatter = new BinaryMessageFormatter(); 

Message m = new Message(); 
m.Body = "your serialisable object or just plain string"; 

queue.Send(m); 


// on the other side 

MessageQueue queue = new MessageQueue(".\\Private$\\yourqueue"); 
queue.Formatter = new BinaryMessageFormatter(); 

Message m = queue.Receive(); 

string s = m.Body as string; 

// s contains that string now 
+1

gelen bu büyük Makaleyi okuyun Üzerinde bir örnek var mı nasıl bir MSMQ ile başlangıçta 'connect' Bir hizmet uygulaması ve ardından ASP.NET MVC için? Bu benim için oldukça yeni. Teşekkür ederim! – Alex

+0

Sadece uygun kuyruğa yazıyorsunuz. Servisiniz sizi arayacaktır. Sıra ve sayfanıza, sıraya mesaj göndermek istediğinizde, '.Send' ifadesini kullanmanız yeterlidir. Küçük bir örnekle güncelleyeceğim. –

+0

Güncellendi. Not Varsa, kuyruğu oluşturma kodunu göstermedim. Ancak bu, System.Messaging API'sinde olduğu gibi önemsiz bir şekilde bulunabilir. Özellikle: MessageQueue.Create (...). Not, ayrıca uygun izinler almanız gerekir. (.SetPermissions). –

5

Sadece ASP.NET MVC'de arka plan işlemi için arama yaparken bu soruyu bulundu. (.NET 4.5'ten sonra kullanılabilir.2)

public ActionResult InitiateLongRunningProcess(Emails emails) 
{ 
    if (ModelState.IsValid) 
    { 
     HostingEnvironment.QueueBackgroundWorkItem(ct => LongRunningProcessAsync(emails.Email)); 
     return RedirectToAction("Index", "Home"); 
    } 

    return View(user); 
} 

Not: Şahsen Web sunucusu arka plan görevlerini çalıştırmak için kullanmayacağım. Ayrıca tekerleği yeniden icat etmeyin, Hangfire'u kullanmanızı şiddetle tavsiye ederim.

Hanselman HowToRunBackgroundTasksInASPNET

İlgili konular