2012-01-12 17 views
6

मैं एक वेब सेवा है कि दो मुख्य वर्गों में विभाजित किया जा सकता है:ASP.Net वेब सेवा: रनिंग कोड एसिंक्रोनस रूप

[WebMethod] 
MyServiceCall() 
{ 
    //Do stuff the client cares about 

    //Do stuff I care about 
} 

मैं क्या करना चाहते हैं क्या चलाया जाता है कि एक और धागा पर 2 हिस्सा है, ताकि ग्राहक इस पर इंतजार नहीं कर रहा है: उपयोगकर्ता के तर्क को पूरा करने के बाद, उन्हें तुरंत अपनी जानकारी भेजें, लेकिन जिन चीजों की मुझे परवाह है (लॉगिंग, आदि) को प्रोसेस करना जारी रखें।

किसी वेब सेवा से, उपयोगकर्ता को जितनी जल्दी हो सके अपनी जानकारी वापस लेने के लिए, उस दूसरे टुकड़े को असीमित रूप से चलाने का अनुशंसित तरीका क्या है? BackgroundWorker? QueueUserWorkItem?

+2

आप इस पढ़ी:

यहाँ एक ट्यूटोरियल है कि अधिक विस्तार में कार्य को शामिल किया गया है http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background -tasks-in-asp-net.aspx –

उत्तर

4

आप Tasks पर देखना चाहते हैं जो .NET 4.0 के लिए नए हैं।

यह आपको एक एसिंक्रोनस ऑपरेशन को बंद करने देता है, लेकिन यह देखने का एक आसान तरीका भी देता है कि यह किया गया है या नहीं।

var task = Task.Factory.StartNew(() => DoSomeWork()); 

यह DoSomeWork() को बंद कर देगा और प्रतीक्षा किए बिना जारी रहेगा ताकि आप अपना अन्य प्रसंस्करण करना जारी रख सकें। जब आप बिंदु जहाँ आप जब तक अपने अतुल्यकालिक कार्य समाप्त हो गया है अब और कार्रवाई करने के लिए नहीं करना चाहते हैं, क्या आप कॉल कर सकते हैं:

task.Wait(); 

कौन सा वहाँ इंतजार करेंगे काम पूरा कर लिया है जब तक। जब तक परिणाम उपलब्ध है task.Result ब्लॉक करने के लिए

var task = Task.Factory.StartNew(() => 
{ 
    Thread.Sleep(3000); 
    return "dummy value"; 
}); 
Console.WriteLine(task.Result); 

एक कॉल: यदि आप एक परिणाम के काम से वापस पाने के लिए चाहते हैं, आप ऐसा कर सकते हैं। http://www.codethinked.com/net-40-and-systemthreadingtasks

+0

इसे उत्तर के रूप में स्वीकार करना; हालांकि, मुझे लगता है कि मैं वास्तव में डारिन डिमिट्रोव की टिप्पणी में ब्लॉग पोस्ट पढ़ने के बाद इस पर इसे लागू करने के लिए रोक रहा हूं। ऐसा लगता है कि ऐसा करने में समस्याएं हो सकती हैं यदि डोमेन जो चल रहा है उसे रोक दिया गया है/पुनर्नवीनीकरण किया गया है – John

1

एक नया धागा बंद आग सबसे आसान तरीका शायद है:

new Thread(() => 
{ 
    /// do whatever you want here 
}).Start(); 

, सावधान रहें, हालांकि - अगर सेवा बहुत बार मारा जाता है, आप धागे कि एक दूसरे को ब्लॉक का एक बहुत बनाने हवा सकता है।

संबंधित मुद्दे