2009-10-12 21 views
7

हमारे पास सर्वर पर ग्राहक जानकारी अपडेट करने की एक सेवा है। एक सेवा कॉल में लगभग कुछ सेकंड लगते हैं, जो सामान्य है।आग और भूलें (Asynch) ASP.NET विधि कॉल

अब हमारे पास एक नया पृष्ठ है जहां एक उदाहरण में लगभग 35-50 कॉस्ट्यूमर जानकारी अपडेट की जा सकती है। सभी ग्राहकों को एक साथ स्वीकार करने के लिए सेवा इंटरफ़ेस को बदलना इस बिंदु पर प्रश्न से बाहर है।

मुझे एक विधि कॉल करने की आवश्यकता है ("ProcessCustomerInfo" कहें), जो ग्राहकों की जानकारी के माध्यम से लूप करेगा और 35-50 बार वेब सेवा कॉल करेगा। असीमित रूप से कॉलिंग सेवा का अधिक उपयोग नहीं है।

मुझे विधि "ProcessCustomerInfo" को अतुल्यकालिक रूप से कॉल करने की आवश्यकता है। मैं इसके लिए RegisterAsyncTask का उपयोग करने का प्रयास कर रहा हूं। वेब पर कई उदाहरण उपलब्ध हैं, लेकिन अगर मैं इस पृष्ठ से दूर जाता हूं तो समस्या इस कॉल को शुरू करने के बाद होती है, प्रसंस्करण बंद हो जाता है।

क्या आग को कार्यान्वित करना संभव है और विधि कॉल भूल जाएं ताकि उपयोगकर्ता विधि प्रसंस्करण को रोकने के बिना पृष्ठ से दूर (दूसरे पृष्ठ पर रीडायरेक्ट) स्थानांतरित कर सके?

उत्तर

8

पर विवरण: http://www.codeproject.com/KB/cs/AsyncMethodInvocation.aspx

मूल रूप से आप एक प्रतिनिधि जो विधि आप एसिंक्रोनस रूप से चलाने के लिए और फिर इसे शुरू BeginInvoke साथ करना चाहते हैं के लिए अंक बना सकते हैं।

// Declare the delegate - name it whatever you would like 
public delegate void ProcessCustomerInfoDelegate(); 

// Instantiate the delegate and kick it off with BeginInvoke 
ProcessCustomerInfoDelegate d = new ProcessCustomerInfoDelegate(ProcessCustomerInfo); 
simpleDelegate.BeginInvoke(null, null); 

// The method which will run Asynchronously 
void ProcessCustomerInfo() 
{ 
    // this is where you can call your webservice 50 times 
} 
+0

धन्यवाद जोएल! मैंने पहले इस विधि को देखा लेकिन अनदेखा किया क्योंकि MethodInvoker System.Windows.Form का हिस्सा है। ऐसा लगता है कि रीडायरेक्शन के साथ ठीक काम कर रहा है, हालांकि मुझे और परीक्षण करने की ज़रूरत है। लेकिन क्या मुझे एएसपी.नेट के लिए इस विधि का उपयोग करना चाहिए? या इसके लिए कोई वेब विकल्प है? – BinaryHacker

+0

ओह हाँ, इसके बारे में क्षमा करें। यह एएसपी.नेट के साथ ठीक काम करेगा, लेकिन अगर आपको ऐसा करने की ज़रूरत नहीं है तो सिस्टम.विंडोज़.फॉर्म को अपनी परियोजना में शामिल करना शर्म की बात होगी। इसके बजाय आप अपना खुद का प्रतिनिधि बना सकते हैं और MethodInvoker के बजाय इसका उपयोग कर सकते हैं। मैंने उपरोक्त कोड नमूना अपडेट किया है। –

+1

MethodInvoke केवल एक प्रतिनिधि है जो आपके लिए पहले से ही कोई पैरामीटर या वापसी मान नहीं है, ताकि आपको अपना खुद का निर्माण करने के लिए समय न लेना पड़े। ProcessCustomerInfoDelegate कि हमने अभी ठीक उसी तरह काम किया है। –

0

मेरा मानना ​​है कि समस्या यह है कि आपकी वेब सेवा क्लाइंट को प्रतिक्रिया वापस करने की उम्मीद कर रही है, कि सेवा कॉल स्वयं एक तरह से संचार नहीं है।

यदि आप अपने वेबसाइसेस के लिए डब्ल्यूसीएफ का उपयोग कर रहे हैं तो एक तरीका सेवा कॉल करने के लिए http://moustafa-arafa.blogspot.com/2007/08/oneway-operation-in-wcf.html देखें।

मेरे दो सेंट: आईएमओ जो भी आप पर निर्माण करते हैं कि आप एक नई सेवा विधि जोड़ने के लिए सेवा इंटरफ़ेस को बदलने में सक्षम नहीं हैं, वह एक अनुचित मांग करता है। यहां तक ​​कि यदि आपकी सेवा सार्वजनिक रूप से उपभोग की गई एपीआई है, तो एक नई सेवा विधि जोड़ने से मौजूदा उपभोक्ताओं को प्रभावित नहीं होना चाहिए।

+0

समस्या सेवा से प्रतिक्रिया नहीं मिल रहा है, लेकिन सेवा को फोन 50 बार किया गया है।सेवा के लिए एक तरफा कॉल मेरी मदद नहीं करेगा, मुझे वास्तव में सेवा कॉल करने वाली विधि को कॉल करने का तरीका ढूंढना होगा ....... बदलना इंटरफ़ेस एक समस्या है क्योंकि यह सेवा किसी अन्य विक्रेता द्वारा उजागर की जाती है और वे इस समय इसे बदलने के लिए तैयार नहीं हैं। – BinaryHacker

+0

एक तरह से सेवा कॉल आपकी समस्याओं को ठीक करेगा, आपको उन्हें सभी अतुल्यकालिक रूप से आग लगने की आवश्यकता नहीं होगी क्योंकि वे अपना अनुरोध डेटा खोलते हैं और उस कनेक्शन को बंद करते हैं जब आप सबमिट करते हैं या जो भी आपका पृष्ठ करता है वह बस समाप्त होता है एक सेकंड और किया जाता है। हालांकि यदि आपके पास सेवा नहीं है तो आप इसे 1 तरीके से नहीं बदल सकते हैं। –

0

सुनिश्चित करें कि आप can हैं।

+0

धन्यवाद। यह वह तरीका है जिसे मैं वर्तमान में कोशिश कर रहा हूं। लेकिन मुद्दा पृष्ठ से दूर फिल्म है। यदि उपयोगकर्ता किसी अन्य पृष्ठ पर जाने के लिए किसी भी लिंक पर क्लिक करता है, तो एसिंच प्रोसेसिंग भी बंद हो जाती है। – BinaryHacker

+0

@ExpertSoul - ऐसा लगता है कि जब आप पृष्ठों को बदलते हैं तो एसिंच प्रसंस्करण रोक रहा है, क्योंकि दस्तावेज़ के अनुसार Restuta से जुड़ा हुआ है, पृष्ठ को प्रस्तुत करने से पहले एसिंक्रोनस कार्यों को पूरा करना होगा (इसे ब्राउज़र पर वितरित करने से पहले)। क्या आपको एक Async = "true" विशेषता के साथ एक पृष्ठ निर्देश जोड़ना याद है या पृष्ठ की AsyncMode प्रॉपर्टी को "सत्य" पर सेट करना याद है? कुछ मुझे बताता है कि आपके एसिंक्रोनस कार्य निष्पादित नहीं हो सकते हैं। –

+0

@ paper1337 - बस इसे फिर से सत्यापित करें। पुनर्निर्देशन कथन के साथ, "ऑनबीजिन" विधि को बुलाया जाता है लेकिन ऑपरेशन का समय समाप्त होता है, इसलिए यह पृष्ठ पर वापस आता है। लेकिन OnBegin अंत तक संसाधित किया जाता है। एक पुनर्निर्देशन कथन के साथ (जिसे मैंने एसिंक विधि कॉल के बाद रखा था) "ऑनबिन" कभी नहीं बुलाया जाता है। इसके अलावा, हालांकि संपत्ति Async = "true" निर्दिष्ट करने के लिए हर जगह इसका उल्लेख किया गया है, लेकिन मुझे इसके साथ या उसके बिना प्रसंस्करण में कोई भिन्नता दिखाई नहीं दे रही है। – BinaryHacker

3

यह कुछ मैं सिर्फ इतना है कि ऐसा करने के लिए मार पड़ी थी ...


    public class DoAsAsync 
    { 
     private Action action; 
     private bool ended; 

     public DoAsAsync(Action action) 
     { 
      this.action = action; 
     } 

     public void Execute() 
     { 
      action.BeginInvoke(new AsyncCallback(End), null); 
     } 

     private void End(IAsyncResult result) 
     { 
      if (ended) 
       return; 

      try 
      { 
       ((Action)((AsyncResult)result).AsyncDelegate).EndInvoke(result); 
      } 
      catch 
      { 
       /* do something */ 
      } 
      finally 
      { 
       ended = true; 
      } 
     } 
    } 

और फिर

new DoAsAsync(ProcessCustomerInfo).Execute();

इसके अलावा पृष्ठ निर्देश में Async संपत्ति निर्धारित करने की आवश्यकता <%@ Page Async="true" %>

मुझे यकीन नहीं है कि यह वास्तव में कितना विश्वसनीय है, हालांकि यह उस काम के लिए काम करता है जिसके लिए मुझे इसकी आवश्यकता है। शायद एक साल पहले यह लिखा था।

+0

मुझे वास्तव में यह समाधान पसंद है। क्या वहां कोई अपडेट या नया पाया गया है क्योंकि प्रतीत होता है कि आप इसे थोड़ी देर के लिए इस्तेमाल कर रहे हैं? –

+0

मुझे इसके साथ समस्याएं याद नहीं हैं। जब यह जवाब उत्पादन में इस्तेमाल किया जा रहा था, और यह अभी भी वहां है।/कंधे उचकाने की क्रिया – Dave

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