AsyncCallback क्या है?


79

AsyncCallback का उपयोग क्या है और हमें इसका उपयोग क्यों करना चाहिए?

जवाबों:


143

जब asyncविधि प्रसंस्करण समाप्त करती है, तो AsyncCallbackविधि को स्वचालित रूप से कहा जाता है, जहां पोस्ट प्रोसेसिंग स्टेटमेंट निष्पादित किया जा सकता है। इस तकनीक के साथ asyncथ्रेड को पूरा करने के लिए सर्वेक्षण या प्रतीक्षा करने की कोई आवश्यकता नहीं है ।

यहाँ Asyncकॉलबैक उपयोग पर कुछ और स्पष्टीकरण दिया गया है :

कॉलबैक मॉडल: कॉलबैक मॉडल के लिए आवश्यक है कि हम कॉलबैक के लिए एक विधि निर्दिष्ट करें और कॉल को पूरा करने के लिए हमें कॉलबैक पद्धति में किसी भी स्थिति को शामिल करना होगा। कॉलबैक मॉडल को निम्न उदाहरण में देखा जा सकता है:

static byte[] buffer = new byte[100];

static void TestCallbackAPM()
{
    string filename = System.IO.Path.Combine (System.Environment.CurrentDirectory, "mfc71.pdb");

    FileStream strm = new FileStream(filename,
        FileMode.Open, FileAccess.Read, FileShare.Read, 1024,
        FileOptions.Asynchronous);

    // Make the asynchronous call
    IAsyncResult result = strm.BeginRead(buffer, 0, buffer.Length,
        new AsyncCallback(CompleteRead), strm);
}

इस मॉडल में, हम एक नया AsyncCallbackप्रतिनिधि बना रहे हैं , जो ऑपरेशन पूरा होने पर (दूसरे धागे पर) कॉल करने के लिए एक विधि निर्दिष्ट कर रहा है। इसके अतिरिक्त, हम कुछ ऑब्जेक्ट को निर्दिष्ट कर रहे हैं जिन्हें हमें कॉल की स्थिति के रूप में आवश्यकता हो सकती है। इस उदाहरण के लिए, हम स्ट्रीम ऑब्जेक्ट भेज रहे हैं क्योंकि हमें स्ट्रीम को कॉल करने EndReadऔर बंद करने की आवश्यकता होगी ।

कॉल के अंत में हमारे द्वारा बनाई जाने वाली विधि कुछ इस तरह दिखाई देगी:

static void CompleteRead(IAsyncResult result)
{
    Console.WriteLine("Read Completed");

    FileStream strm = (FileStream) result.AsyncState;

    // Finished, so we can call EndRead and it will return without blocking
    int numBytes = strm.EndRead(result);

    // Don't forget to close the stream
    strm.Close();

    Console.WriteLine("Read {0} Bytes", numBytes);
    Console.WriteLine(BitConverter.ToString(buffer));
}

अन्य तकनीकें हैं वेट-अप और पोलिंग

रुको-जब तक किया मॉडल प्रतीक्षा-तब तक किया गया मॉडल आपको अतुल्यकालिक कॉल शुरू करने और अन्य कार्य करने की अनुमति देता है। एक बार अन्य काम पूरा हो जाने के बाद, आप कॉल को समाप्त करने का प्रयास कर सकते हैं और यह तब तक ब्लॉक हो जाएगा जब तक कि एसिंक्रोनस कॉल पूरा न हो जाए।

// Make the asynchronous call
strm.Read(buffer, 0, buffer.Length);
IAsyncResult result = strm.BeginRead(buffer, 0, buffer.Length, null, null);

// Do some work here while you wait

// Calling EndRead will block until the Async work is complete
int numBytes = strm.EndRead(result);

या फिर आप वेट हैंडल का उपयोग कर सकते हैं।

result.AsyncWaitHandle.WaitOne();

मतदान मॉडल मतदान पद्धति समान है, इस अपवाद के साथ कि कोड IAsyncResultयह देखने के लिए मतदान करेगा कि क्या उसने पूरा कर लिया है।

// Make the asynchronous call
IAsyncResult result = strm.BeginRead(buffer, 0, buffer.Length, null, null);

// Poll testing to see if complete
while (!result.IsCompleted)
{
    // Do more work here if the call isn't complete
    Thread.Sleep(100);
}

1
क्या ऐसा करने का कोई तरीका है जिससे कि FullRead एक गैर-स्थिर फ़ंक्शन है?
greggorob64

1
हाँ, आप TestCallbackAPM और कम्प्लीट रीट दोनों तरीके अपना सकते हैं।
SO उपयोगकर्ता

32

इस पर इस तरीके से विचार करें। आपके पास कुछ ऑपरेशन हैं जो आप समानांतर में निष्पादित करना चाहते हैं। आप इसे थ्रेड का उपयोग करके सक्षम करेंगे जो एसिंक्रोनस रूप से निष्पादित करता है। यह एक आग और भूल तंत्र है।

लेकिन कुछ परिस्थितियां एक ऐसे तंत्र के लिए कहती हैं जहां आप आग लगा सकते हैं और भूल सकते हैं लेकिन ऑपरेशन पूरा होने पर अधिसूचना की आवश्यकता है। इसके लिए, आप एक async कॉलबैक का उपयोग करेंगे।

ऑपरेशन async है, लेकिन ऑपरेशन पूरा होने पर आपको वापस कॉल करता है। इसका लाभ यह है कि आपको ऑपरेशन पूरा होने तक इंतजार नहीं करना होगा। आप अन्य कार्यों को निष्पादित करने के लिए स्वतंत्र हैं और इसलिए आपका धागा अवरुद्ध नहीं है।

इसका एक उदाहरण एक बड़ी फाइल का बैकग्राउंड ट्रांसफर होगा। जबकि स्थानांतरण प्रगति पर है, आप वास्तव में उपयोगकर्ता को अन्य कार्यों को करने से रोकना नहीं चाहते हैं। एक बार स्थानांतरण पूरा हो जाने के बाद, प्रक्रिया आपको एक async विधि पर वापस बुलाएगी, जहाँ आप संभवतः एक संदेश बॉक्स को पॉप अप कर सकते हैं, जो कहता है कि 'स्थानांतरण करें'।


4

AsyncCallbacks को एक एसिंक्रोनस ऑपरेशन पूरा होने पर कॉल करने के लिए फ़ंक्शन को निर्दिष्ट करने के लिए उपयोग किया जाता है। उदाहरण के लिए, यदि आप एक IO ऑपरेशन कर रहे थे तो आप BeginRead को एक स्ट्रीम पर कॉल करेंगे और एक AsyncCAllback प्रतिनिधि में पास होंगे। रीड ऑपरेशन पूरा होने पर फ़ंक्शन को बुलाया जाएगा।

अधिक जानकारी के लिए देखें:

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.