2011-06-10 11 views
6

मेरे पास एक ऐसा फ़ंक्शन है जिसे केवल एसिंक्रोनस फ़ंक्शन से कॉलबैक प्राप्त होने पर निष्पादित करने की आवश्यकता होती है।एसिंक्रोनस फ़ंक्शन के लिए कॉलबैक तक एक धागा कैसे सोना है?

तरह

मैं अतुल्यकालिक समारोह Stop() और जल्द ही उस के बाद मैं अतुल्यकालिक समारोह Start() फोन पर कॉल करें।

स्टॉप कॉलबैक प्राप्त होने से पहले जारी किया गया Start() कहा जाता है और इस प्रकार मुझे समस्याएं मिल रही हैं। इसके अलावा, मैं दो कार्यों के बुला अलग नहीं कर सकते जैसे कि मैंने इस .:

public void SomeFunction() 
{ 
    Stop(); 
} 

public void Stop_CallBack(eventargs e) 
{ 
    Start(); 
} 

मैं यह करने के लिए है नहीं कर सकते:

public void SomeFunction() 
{ 

    Stop(); 
    //Do something; 

    Start(); 
} 

लेकिन इससे पहले कि मैं प्राप्त वापस बुलाना मेरा प्रारंभ बंद करो() फ़ंक्शन इस प्रकार मेरे लिए समस्याएं पैदा की जाती हैं।

क्या कोई मेरी मदद कर सकता है कि मैं इस समस्या को कैसे हल कर सकता हूं।

उत्तर

18

यह तब होता है जब आप प्रतीक्षा हैंडल का उपयोग करना चाहते हैं। यहाँ एक दृष्टिकोण को दिखाने के लिए एक शॉर्ट कोड नमूना है:

class AsyncDemo 
{ 
    AutoResetEvent stopWaitHandle = new AutoResetEvent(false); 
    public void SomeFunction() 
    {  
     Stop(); 
     stopWaitHandle.WaitOne(); // wait for callback  
     Start(); 
    } 
    private void Start() 
    { 
     // do something 
    } 
    private void Stop() 
    { 
     // This task simulates an asynchronous call that will invoke 
     // Stop_Callback upon completion. In real code you will probably 
     // have something like this instead: 
     // 
     //  someObject.DoSomethingAsync("input", Stop_Callback); 
     // 
     new Task(() => 
      { 
       Thread.Sleep(500); 
       Stop_Callback(); // invoke the callback 
      }).Start(); 
    } 

    private void Stop_Callback() 
    { 
     // signal the wait handle 
     stopWaitHandle.Set(); 
    } 

} 
+1

क्या आप समझा सकते हैं कि आपको 'Stop_Callback' क्यों चाहिए? क्यों नहीं 'stopWaitHandle.Set();' सीधे कार्य में? –

+1

@ डैनियल: * मुझे * इसकी आवश्यकता नहीं है; लेकिन सवाल बताता है * "[...] फ़ंक्शन जिसे केवल कॉलबैक प्राप्त होने पर निष्पादित करने की आवश्यकता होती है [...]" * और ओपी ने दिए गए कोड नमूने में पहले से ही ऐसे कॉलबैक का सुझाव दिया था। मैं जितना संभव हो उतना छोटा ओपी कोड पुन: स्थापित करना चाहता हूं। यह हो सकता है कि कॉलबैक तीसरे पक्ष कोड से लागू किया गया है जिसके लिए उदाहरण के लिए प्रतीक्षा संभाल तक पहुंच नहीं है। –

+0

मैं Stop_callback को कॉल नहीं कर सकता। यह कुछ अन्य एप्लिकेशन से प्राप्त कॉल वापस है। – Sumit

2

इन सदस्य कार्यों की तरह लग रही के बाद से, आप एक घटना सदस्य चर जोड़ सकते हैं (या तो एक ManualResetEvent या एक AutoResetEvent। तब Stop() विधि में आप घटना का संकेत करने के लिए कॉल के बीच निर्धारित किया है। में रोकने के लिए() और प्रारंभ() आप घटना के लिए इंतजार रोक समारोह में

private AutoResetEvent _stopped = new AutoResetEvent(false); 

public void SomeFunction() 
{ 
    Stop(); 
    _stopped.WaitOne(); 
    Start(); 
} 

आप

private void Stop() 
{ 
    try 
    { 
     // Your code that does something to stop 
    } 
    finally 
    { 
     _stopped.Set(); // This signals the event 
    } 
} 

करना चाहते हैं, तो एक ManualResetEvent का उपयोग कर -।

private ManualResetEvent _stopped = new ManualResetEvent(false); 

public void SomeFunction() 
{ 
    Stop(); 
    _stopped.WaitOne(); 
    Start(); 
} 

private void Stop() 
{ 
    try 
    { 
     // Your code that does something to stop 
    } 
    finally 
    { 
     _stopped.Set(); // This signals the event 
    } 
} 

private void Start() 
{ 
    _stopped.Reset(); 

    // Your other start code here 
} 
+0

मैं पहले से ही AutoResetEvent और ManualRestEvent साथ की कोशिश की है और यह – Sumit

+0

काम किया फ्लॉप आप तो एक ManualResetEvent का उपयोग आप इसे पुनर्स्थापित करने के लिए है, तो ('_stopped.Reset()') WaitOne कॉल के बाद, अन्यथा यह एक संकेतित स्थिति में रहता है। – pstrjds

+0

ऑटो और मैन्युअल रीसेट ईवेंट के साथ काम नहीं करने के द्वारा आपका क्या मतलब है? आपका कोड WaitOne() कॉल पर अवरुद्ध नहीं हुआ था? उस स्थिति में आप अधिक कोड पोस्ट कर सकते हैं? अगर आपके पास एक ऐसा फ़ंक्शन है जो स्टॉप को कॉल कर रहा है, कुछ कर रहा है और फिर स्टार्ट कॉल कर रहा है। जब तक स्टॉप में ईवेंट को संकेत दिया जा रहा है और केवल शुरुआत में रीसेट हो जाता है तो आपका कोड प्रतीक्षा किए जाने तक प्रतीक्षाऑन पर अवरुद्ध हो जाएगा। – pstrjds