2010-05-05 31 views
8

जीयूआई को ठंडा करने से बचने के लिए, मैं डीबी को असीमित रूप से कनेक्ट करने की विधि को चलाने के लिए चाहता था। इसलिए मैं इस में लिखा है:मेरी BeginInvoke विधि async क्यों नहीं है?

DelegatLoginu dl = ConnectDB; 

IAsyncResult ar = dl.BeginInvoke(null, null); 

var result = (bool)dl.EndInvoke(ar); 

लेकिन यह अभी भी ठंड है और मैं क्यों समझ में नहीं आता। मैंने सोचा BeginInvoke सुनिश्चित करता है कि आवंटित कोड किसी अन्य धागे में चलता है। धन्यवाद!

उत्तर

12

कॉलिंग एंडइवोक() कॉलिंग Beginvvoke() कॉल पूरा होने तक अवरुद्ध हो जाएगा।

public void DemoCallback() 
{ 
    MethodDelegate dlgt = new MethodDelegate (this.LongRunningMethod) ; 
    string s ; 
    int iExecThread; 

    // Create the callback delegate. 
    AsyncCallback cb = new AsyncCallback(MyAsyncCallback); 

    // Initiate the Asynchronous call passing in the callback delegate 
    // and the delegate object used to initiate the call. 
    IAsyncResult ar = dlgt.BeginInvoke(3000, out iExecThread, cb, dlgt); 
} 

public void MyAsyncCallback(IAsyncResult ar) 
{ 
    string s ; 
    int iExecThread ; 

    // Because you passed your original delegate in the asyncState parameter 
    // of the Begin call, you can get it back here to complete the call. 
    MethodDelegate dlgt = (MethodDelegate) ar.AsyncState; 

    // Complete the call. 
    s = dlgt.EndInvoke (out iExecThread, ar) ; 

    MessageBox.Show (string.Format ("The delegate call returned the string: \"{0}\", 
           and the number {1}", s, iExecThread.ToString())); 
} 
+0

क्या मुझे AsyncCallBack क्लास का उपयोग करने की आवश्यकता है या मैं सरल प्रतिनिधि पास कर सकता हूं? – Petr

+1

इसे एक AsyncCallBack प्रतिनिधि होना चाहिए, यानीआपका फ़ंक्शन उपरोक्त MyAsyncCallback() उदाहरण जैसा दिखना चाहिए - वापसी रद्द करें, और पैरामीटर के रूप में IAsyncResult में ले जाएं। – RickL

+0

मैंने स्थानीय रूप से इस कोड का परीक्षण किया है और यह काम नहीं करता है (यह संकलित करता है, लेकिन यह स्क्रीन पर कुछ भी नहीं दिखाता है): http://ideone.com/V8b2NY – InfZero

2

dl.EndInvoke(ar) पर कॉल करते समय आप तुरंत अपने यूआई थ्रेड को अवरुद्ध कर रहे हैं। इस तरह की एसिंक कॉल करने के पूरे उद्देश्य को हराया जाता है।

+0

ठीक है, यह mz अनुमान था .. तो यह अच्छा क्या है? मैंने सोचा कि यह बैकराउंड में सभी कनेक्शन सामान करता है और फिर केवल लौटाता है :( – Petr

+0

कॉल के ठीक बाद 'BeginXxx' रिटर्न देता है, जिस समय पृष्ठभूमि में कनेक्शन सामग्री को संभाला जा रहा है। परिणाम न मिलने पर, आपको मिल जाएगा अधिसूचित (या तो कॉलबैक द्वारा या 'IAsyncResult' में' WaitHandle' 'पर मतदान करके' BeginXxx' कॉल 'द्वारा लौटाया गया। इस बिंदु पर आप परिणाम पुनर्प्राप्त करने के लिए' EndXxx' 'का आह्वान करते हैं (या कॉल में खुश अपवाद प्राप्त करते हैं)। 'EndXxx' को कॉल करना परिणाम तैयार होने तक प्रतीक्षा करें। – Lucero

5

EndInvokehere का विवरण देखें, विशेष रूप से:

EndInvoke

आप जब यह खत्म अपने लंबे समय से चल विधि एक कॉलबैक आह्वान करने के लिए के लिए आदेश में पैटर्न के इस प्रकार की जरूरत है() फ़ंक्शन का उपयोग पर किया जाता है असीमित कॉल के परिणाम पुनर्प्राप्त करें। इसे BeginInvoke() के बाद कभी भी कहा जा सकता है। यदि असीमित कॉल अभी तक पूरा नहीं हुआ है, तो EndInvoke() ब्लॉक तब तक पूर्ण हो जाता है।

0

कॉलइनेवोक में कॉल पूरा होने पर कॉल करने के लिए एक विधि निर्दिष्ट करें (जैसे dl.BeginInvoke (null, OnConnectCompleted)। तब धागा अवरुद्ध नहीं होगा।

0

एंडइनवोक पर कॉल आपके वर्तमान धागे को अवरुद्ध कर देगा। आपको EndInvoke

1

पर कॉल करने के बजाय BeginInvoke में एक प्रतिनिधि को पास करना चाहिए। .NET as this question में एसिंक मॉडल का उपयोग करने के लिए 4 अलग-अलग पैटर्न हैं।

आप का उपयोग कर रहे हैं "मैं आपको कॉल करूंगा" दृष्टिकोण। लेकिन यदि आप प्रतीक्षा करने के लिए जब तक काम आइटम समाप्त हो गया है चाहते हैं, सबसे अच्छा तकनीक का उपयोग करने के लिए है एक Mutex (WaitHandle):

void Run() 
{ 
    Action<string> doWork = DoWork; 
    IAsyncResult result = doWork.BeginInvoke("I will call you", null, null); 

    // You "call the method" - wait 10 seconds for the method to finish. 
    bool success = result.AsyncWaitHandle.WaitOne(10 * 1000); 
} 

void DoWork() 
{ 
} 

मुझे लगता है आप ब्लॉक करने के लिए नहीं करना चाहते हैं, जिसमें मामले "आग और भूलें " कम से कम सिरदर्द का कारण बनता है।

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