2011-03-14 13 views
7

asp.net में मेरे पृष्ठ लोड में एक ही समय में एक से अधिक विधि कैसे कॉल करें ?? मेरे पृष्ठ लोड ईवेंट में कॉल करने के लिए मेरे पास 4 तरीके हैं। लेकिन मैं सभी 4 विधियों को कॉल करना चाहता हूं और खत्म करने के लिए पहली विधि का इंतजार नहीं करना चाहता हूं, फिर दूसरी विधि को कॉल करें।एक ही समय में एक से अधिक तरीकों को आमंत्रित या कॉल करें?

यह कैसे प्राप्त करें asp.net 4.0 में है?

+0

बहु-थ्रेडिंग –

+0

हाय अभिषेक का उपयोग करें, आप एक समय में सभी 4 विधियों को कॉल नहीं कर सकते हैं, कम से कम एक सेकंड देरी होनी चाहिए। यदि आप अभी भी 4 विधियों को कॉल करना चाहते हैं तो डेविड पाइरास ने आपको मल्टीथ्रेडिंग का उपयोग करने और वापसी के मूल्य के लिए "पृष्ठभूमिवर्कर" वर्ग बीकॉज़ की मदद लेने के लिए कहा है, जब तक कि सभी 4 विधियां निष्पादित न हों। – SharpUrBrain

+1

@SharpUrBrain - कुछ भी करने के लिए "एक सेकंड" क्या है?और आईएमओ पृष्ठभूमिवर्कर वेब स्तरीय –

उत्तर

9
Task[] tasks = new Task[] 
{ 
    new Task(Method0), 
    new Task(Method1), 
    new Task(Method2), 
    new Task(Method3) 
} 

foreach(var task in tasks) 
    task.Start(); 

या अधिक शीघ्र ही

new Task(Method0).Start(); 
new Task(Method1).Start(); 
new Task(Method2).Start(); 
new Task(Method3).Start(); 
+2

पर भी एक खराब विकल्प है, 'नया [] {नया कार्य (विधि 0), ..., नया कार्य (विधिएन)}' –

+0

काम करना चाहिए धन्यवाद @Marc, संपादित! –

1

आप अपने तरीकों यह काम करेगा अतुल्यकालिक करते हैं।

(मूल ठूंठ):

method1(onReadyCallback1); 
method2(onReadyCallback2); 

private void onReadyCallback1() { 

} 

आदि

1

MSDN प्रलेखीकरण से

एक उदाहरण के लिए ThreadPool.QueueUserWorkItem और फिर here पर एक नजर डालें

using System; 
using System.Threading; 
public class Example { 
    public static void Main() { 
     // Queue the task. 
     ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc)); 

     Console.WriteLine("Main thread does some work, then sleeps."); 
     // If you comment out the Sleep, the main thread exits before 
     // the thread pool task runs. The thread pool uses background 
     // threads, which do not keep the application running. (This 
     // is a simple example of a race condition.) 
     Thread.Sleep(1000); 

     Console.WriteLine("Main thread exits."); 
    } 

    // This thread procedure performs the task. 
    static void ThreadProc(Object stateInfo) { 
     // No state object was passed to QueueUserWorkItem, so 
     // stateInfo is null. 
     Console.WriteLine("Hello from the thread pool."); 
    } 
} 
14

पहले बंद, यह जानना महत्वपूर्ण है कि आप क्या कर रहे हैं वह है ible। अगर वे सभी सीपीयू-बाध्य हैं, तो ऐसा करें, आईएमओ; एक वेब सर्वर पहले से ही बहुत थ्रेड किया गया है, और आमतौर पर शुरू करने के लिए एक व्यस्त जगह है। संभावना अधिक है कि आप एकाधिक कोर का उपयोग कर पूरी चीज को धीमा कर देंगे। हालांकि, 1 उपयोगकर्ता के लिए यह बहुत अच्छा लगेगा!

यदि आप आईओ-बाउंड हैं, तो कोई भी ऐसा करने के तरीके हैं; पसंदीदा जो भी आप बात कर रहे हैं उसके इनबिल्ट एसिंक तरीकों का उपयोग करना होगा, ताकि आप नियमित थ्रेड के बजाय आईओसीपी का उपयोग कर सकें। तो NetworkStream के लिए, आप BeginRead(...) आदि का उपयोग करेंगे

फिर आपको सबकुछ एक साथ शामिल होने की आवश्यकता है। बहुत अधिक तरीके; व्यक्तिगत रूप से मैं Monitor.Wait और Monitor.Pulse का उपयोग करता हूं, क्योंकि यह अप्रबंधित कोड पर जाने से बचाता है (कई प्रतीक्षा-हैंडल वास्तव में ओएस-प्रदान किए जाते हैं)।

यह भी ध्यान दें: थ्रेडिंग/समांतरता असफल होने के कई मजेदार तरीकों के साथ एक बंडल में आती है; आम तौर पर आपको केवल स्थिर सिंक्रनाइज़ेशन के लिए विधियों/डेटा के बारे में अधिक चिंता करने की आवश्यकता है, लेकिन यदि आपके पास एक ही अनुरोध में एकाधिक अनुरोध चीजें कर रहे हैं: बाधाओं के लिए देखें ... बहुत सारे हैं।

.NET का अगला संस्करण निरंतरता को बहुत आसान बनाने के लिए है; मुझे यह देखने की ज़रूरत है कि हम आईओसीपी परिदृश्यों में वर्तमान प्रयोगात्मक कोड कितनी आसानी से लागू कर सकते हैं।

+3

नाइस मार्क, यह निश्चित रूप से इस तरह के एक प्रश्न का उत्तर देने का तरीका है क्योंकि यह सिर्फ सवाल का जवाब देने के बजाय थोड़ा और मार्गदर्शन देता है। –

+0

"एक वेब सर्वर पहले से ही बहुत थ्रेड किया गया है" - इस लाइन ने मुझे अपने आवेदन के लिए कई कॉल से बचने के लिए बनाया है। धन्यवाद!! – xameeramir

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