कॉलबैक क्या है?


139

कॉलबैक क्या है और इसे C # में कैसे लागू किया जाता है?


क्या आप ASP.Net कॉलबैक या प्रतिनिधि कॉलबैक पैरामीटर की बात कर रहे हैं?
स्लाक्स

8
यह कई चीजों का मतलब हो सकता है - आपने इसे किस संदर्भ में सुना है?
अपरान्ह

1
मुझे लगता है कि वह एक Async के बारे में बात कर रहा है। कॉलबैक
जॉर्ज जॉनसन

8
-1 प्रश्न अस्पष्ट है (पर्याप्त विवरण नहीं)।
सेरियो

1
आपको निश्चित प्रश्नों के लिए google से पूछना चाहिए।
ओजगुर डोगस

जवाबों:


123

में कंप्यूटर प्रोग्रामिंग , एक कॉलबैक है निष्पादन योग्य कोड है कि एक के रूप में पारित हो जाता है तर्क अन्य कोड के लिए।

- विकिपीडिया: कॉलबैक (कंप्यूटर विज्ञान)

C # के पास उस उद्देश्य के लिए प्रतिनिधि हैं । वे घटनाओं के साथ भारी रूप से उपयोग किए जाते हैं , क्योंकि एक घटना स्वचालित रूप से संलग्न प्रतिनिधियों (इवेंट हैंडलर) को आमंत्रित कर सकती है।


10
वास्तव में एक कॉलबैक निष्पादन योग्य कोड का एक संकेतक है जो अन्य कोड के लिए एक तर्क के रूप में पारित किया जाता है ... पृष्ठ को समीक्षा की आवश्यकता है
गियानलुका गेथिनी

8
@G_G: ऐसा कुछ भी नहीं है जो कहता है कि उसे सूचक होना चाहिए। यह आमतौर पर है क्योंकि डेटा खंड निष्पादन योग्य नहीं है, लेकिन यह तकनीकी रूप से एक कार्यान्वयन विवरण है।
जॉय

जॉय: यू सही हैं यह एक कार्यान्वयन विवरण है, लेकिन कॉलबैक कार्यान्वयन विस्तार भी है। आप बिना किसी एकल कॉलबैक के अपने कोड को फिर से लिख सकते हैं। यह 'जबकि' बनाम 'के लिए' जैसा है।
जियानलुका घेटिनी

1053

मैं आपसे मिला था,
और यह पागल है,
लेकिन यहां मेरा नंबर (प्रतिनिधि) है,
इसलिए यदि कुछ होता है (घटना),
मुझे कॉल करें, हो सकता है (कॉलबैक)?


33
पूरी तरह से शांत विवरण। जब भी कोई पूछता है मैं इस स्पष्टीकरण का उपयोग करूंगा, आशा है कि मुझे इसका उपयोग करने के लिए अधिकार मिल सकते हैं?
निकोला डेविडोविक

15
+1: इसे प्यार करो। यह गीत को बर्बाद कर देता है, लेकिन इसे पढ़ना चाहिए `लेकिन यहां मेरा नंबर और एक विशिष्ट प्रकार के फोन (प्रतिनिधि) का उपयोग करने के निर्देश हैं
कोडिंग

8
अपने चेहरे पर मुस्कान के साथ प्रतिनिधि जानें :-)
आकाश

8
सबसे अच्छा स्पष्टीकरण कभी!
zhengtonic

3
ध्यान दें कि उस स्पष्टीकरण के साथ अन्य लोगों को प्रतिनिधि शिक्षण केवल एक अच्छी कोरियोग्राफी के साथ काम करता है :)
सेबास्टियन सेवरीन

87

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

कॉलबैक का उपयोग आमतौर पर अतुल्यकालिक तर्क में होता है।

C # में कॉलबैक बनाने के लिए, आपको एक वेरिएबल के अंदर एक फंक्शन एड्रेस स्टोर करना होगा। यह एक delegateया नए लंबोदर शब्दार्थ का उपयोग करके प्राप्त किया जाता है Funcया Action

    public delegate void WorkCompletedCallBack(string result);

    public void DoWork(WorkCompletedCallBack callback)
    {
        callback("Hello world");
    }

    public void Test()
    {
        WorkCompletedCallBack callback = TestCallBack; // Notice that I am referencing a method without its parameter
        DoWork(callback);
    }

    public void TestCallBack(string result)
    {
        Console.WriteLine(result);
    }

आज C # में, लैम्बडा का उपयोग करके ऐसा किया जा सकता है:

    public void DoWork(Action<string> callback)
    {
        callback("Hello world");
    }

    public void Test()
    {
        DoWork((result) => Console.WriteLine(result));
    }

49

परिभाषा

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

कार्यान्वयन

// Parent can Read
public class Parent
{
    public string Read(){ /*reads here*/ };
}

// Child need Info
public class Child
{
    private string information;
    // declare a Delegate
    delegate string GetInfo();
    // use an instance of the declared Delegate
    public GetInfo GetMeInformation;

    public void ObtainInfo()
    {
        // Child will use the Parent capabilities via the Delegate
        information = GetMeInformation();
    }
}

प्रयोग

Parent Peter = new Parent();
Child Johny = new Child();

// Tell Johny from where to obtain info
Johny.GetMeInformation = Peter.Read;

Johny.ObtainInfo(); // here Johny 'asks' Peter to read

लिंक


2
हाय @serhio आपके उत्तर के लिए धन्यवाद। यह अभी भी मेरे लिए थोड़ा मुरीद है: जहां वास्तव में कोड को अन्य कोड के तर्क के रूप में पारित किया जाता है, वह है पीटर की जोड़ी।
BKSpurgeon 20

1
@serhio लिंक की मृत।
जूड

10

कॉलबैक एक फ़ंक्शन पॉइंटर है जिसे आप दूसरे फ़ंक्शन में पास करते हैं। जिस फ़ंक्शन को आप कॉल कर रहे हैं वह पूरा होने पर दूसरे फ़ंक्शन को 'कॉलबैक' (निष्पादित) करेगा।

की जाँच करें इस लिंक।


2
एक कॉलबैक को एक विधि के प्रतिनिधि के रूप में लागू किया जा सकता है, लेकिन आप समान रूप से कह सकते हैं कि एक वस्तु को पारित करना जो इसके इंटरफ़ेस पर कॉलबैक विधि का समर्थन करता है।
जो

Array.Sort (arrayObject); arrayObject के तत्वों पर obj.CompareTo (एक औरObj) कॉल करना .Net में इंटरफ़ेस (ICompareable) का उपयोग करके कॉलबैक का एक उत्कृष्ट उदाहरण है।
11:550 पर Ron5504

8

यदि आप ASP.Net कॉलबैक की बात कर रहे हैं:

ASP.NET वेब पेज के लिए डिफ़ॉल्ट मॉडल में, उपयोगकर्ता एक पेज के साथ इंटरैक्ट करता है और एक बटन क्लिक करता है या कुछ अन्य क्रिया करता है जिसके परिणामस्वरूप पोस्टबैक होता है। पृष्ठ और उसके नियंत्रण फिर से बनाए जाते हैं, पृष्ठ कोड सर्वर पर चलता है, और पृष्ठ का एक नया संस्करण ब्राउज़र को प्रदान किया जाता है। हालांकि, कुछ स्थितियों में, क्लाइंट से पोस्टबैक प्रदर्शन किए बिना सर्वर कोड को चलाना उपयोगी है। यदि पृष्ठ में क्लाइंट स्क्रिप्ट कुछ राज्य की जानकारी (उदाहरण के लिए, स्थानीय चर मान) बनाए रख रही है, तो पृष्ठ को पोस्ट करना और इसकी एक नई प्रतिलिपि प्राप्त करना उस स्थिति को नष्ट कर देता है। इसके अतिरिक्त, पृष्ठ पोस्टबैक प्रसंस्करण ओवरहेड को प्रस्तुत करता है जो प्रदर्शन को कम कर सकता है और उपयोगकर्ता को संसाधित होने और फिर से बनाए जाने के लिए प्रतीक्षा करने के लिए मजबूर कर सकता है।

क्लाइंट स्थिति खोने से बचने के लिए और सर्वर राउंडट्रिप के प्रसंस्करण ओवरहेड को लाइक नहीं करने के लिए, आप ASP.NET वेब पेज को कोड कर सकते हैं ताकि यह क्लाइंट कॉलबैक कर सके। क्लाइंट कॉलबैक में, क्लाइंट-स्क्रिप्ट फ़ंक्शन ASP.NET वेब पेज पर एक अनुरोध भेजता है। वेब पेज अपने सामान्य जीवन चक्र का एक संशोधित संस्करण चलाता है। पृष्ठ शुरू किया गया है और इसके नियंत्रण और अन्य सदस्य बनाए गए हैं, और फिर एक विशेष रूप से चिह्नित विधि लागू की गई है। विधि उस संसाधन को निष्पादित करती है जिसे आपने कोडित किया है और फिर उस ब्राउज़र पर एक मान लौटाता है जिसे किसी अन्य क्लाइंट स्क्रिप्ट फ़ंक्शन द्वारा पढ़ा जा सकता है। इस पूरी प्रक्रिया के दौरान, पेज ब्राउज़र में लाइव होता है।

स्रोत: http://msdn.microsoft.com/en-us/library/ms178208.aspx

यदि आप कोड में कॉलबैक की बात कर रहे हैं:

कॉलबैक अक्सर उन विधियों के प्रतिनिधि होते हैं जिन्हें विशिष्ट ऑपरेशन पूरा होने या उप-क्रिया करने पर कॉल किया जाता है। आप अक्सर उन्हें अतुल्यकालिक संचालन में पाएंगे। यह एक प्रोग्रामिंग सिद्धांत है जिसे आप लगभग हर कोडिंग भाषा में पा सकते हैं।

अधिक जानकारी यहाँ: http://msdn.microsoft.com/en-us/library/ms173172.aspx


4

लाइटस्ट्राइकर के लिए समर्पण:
नमूना कोड:

class CallBackExample
{
    public delegate void MyNumber();
    public static void CallMeBack()
    {
        Console.WriteLine("He/She is calling you.  Pick your phone!:)");
        Console.Read();
    }
    public static void MetYourCrush(MyNumber number)
    {
        int j;
        Console.WriteLine("is she/he interested 0/1?:");
        var i = Console.ReadLine();
        if (int.TryParse(i, out j))
        {
            var interested = (j == 0) ? false : true;
            if (interested)//event
            {
                //call his/her number
                number();
            }
            else
            {
                Console.WriteLine("Nothing happened! :(");
                Console.Read();
            }
        }
    }
    static void Main(string[] args)
    {
        MyNumber number = Program.CallMeBack;
        Console.WriteLine("You have just met your crush and given your number");
        MetYourCrush(number);
        Console.Read();
        Console.Read();
    }       
}

कोड स्पष्टीकरण:

मैंने उत्तर में से एक में लाइटस्टाइकर द्वारा प्रदान की गई मजेदार व्याख्या को लागू करने के लिए कोड बनाया। हम एक विधि ( MetYourCrush) को प्रतिनिधि (संख्या) पास कर रहे हैं । यदि रुचि (घटना) विधि में होती है ( MetYourCrush) तो यह प्रतिनिधि (संख्या) को बुलाएगा जो CallMeBackविधि के संदर्भ को पकड़े हुए था । तो, CallMeBackविधि कहा जाएगा। मूल रूप से, हम कॉलबैक पद्धति को कॉल करने के लिए प्रतिनिधि को पास कर रहे हैं।

यदि आपके कोई सवाल हैं तो कृपया मुझे बताएं।


यह प्रश्न का पर्याप्त रूप से उत्तर नहीं देता है, क्या आप बता सकते हैं कि आपका कोड क्या कर रहा है, यह वर्णन करने के लिए कि कॉलबैक कैसे काम करता है, और यह C # में कैसे लागू किया जाता है।
एडम

हाय एडम, आपके उत्तर के लिए धन्यवाद। मैंने लाइटस्ट्रीकर द्वारा प्रदान की गई मजेदार व्याख्या को लागू करने के लिए कोड बनाया। हम एक विधि (MetYourCrush) में प्रतिनिधि (संख्या) पास कर रहे हैं। यदि रुचि (घटना) विधि (MetYourCrush) में होती है, तो यह प्रतिनिधि (संख्या) को कॉल करेगा जो CallMeBack विधि का संदर्भ ले रहा था। तो, CallMeBack विधि को कॉल किया जाएगा। मूल रूप से, हम कॉलबैक पद्धति को कॉल करने के लिए प्रतिनिधि को पास कर रहे हैं। यदि आपके कोई सवाल हैं तो कृपया मुझे बताएं।
मणि

1

संभवतः शब्दकोश की परिभाषा नहीं है, लेकिन एक कॉलबैक आमतौर पर एक फ़ंक्शन को संदर्भित करता है, जो एक विशेष वस्तु के लिए बाहरी है, संग्रहीत किया जा रहा है और फिर एक विशिष्ट घटना पर बुलाया जाता है।

एक उदाहरण हो सकता है जब एक यूआई बटन बनाया जाता है, यह एक फ़ंक्शन के संदर्भ को संग्रहीत करता है जो एक क्रिया करता है। कार्रवाई कोड के एक अलग हिस्से द्वारा नियंत्रित की जाती है लेकिन जब बटन दबाया जाता है, तो कॉलबैक कहा जाता है और यह कार्रवाई करने के लिए आमंत्रित करता है।

C #, कॉलबैक शब्द का उपयोग करने के बजाय 'घटनाओं' और 'प्रतिनिधियों' का उपयोग करता है और आप यहां प्रतिनिधियों के बारे में अधिक जानकारी प्राप्त कर सकते हैं ।


0

कॉलबैक आपको निष्पादन योग्य कोड को अन्य कोड के तर्क के रूप में पास करने देता है। C और C ++ में इसे फ़ंक्शन पॉइंटर के रूप में लागू किया जाता है। .NET में आप फंक्शन पॉइंटर्स को प्रबंधित करने के लिए एक प्रतिनिधि का उपयोग करेंगे।

कुछ उपयोगों में त्रुटि सिग्नलिंग और नियंत्रित करना शामिल है कि कोई फ़ंक्शन कार्य करता है या नहीं।

विकिपीडिया


0

कॉलबैक कार्य चरण:

1) हमें ICallbackEventHandlerइंटरफ़ेस लागू करना होगा

2) ग्राहक स्क्रिप्ट पंजीकृत करें:

 String cbReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context");
    String callbackScript = "function UseCallBack(arg, context)" + "{ " + cbReference + ";}";
    Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "UseCallBack", callbackScript, true);

1) यूआई कॉल से ओनक्लिएंट क्लिक कॉल जावास्क्रिप्ट फ़ंक्शन के लिए EX: - builpopup(p1,p2,p3...)

var फाइनलफ़ील्ड = p1, P2, p3; UseCallBack(finalfield, ""); UseCallBack का उपयोग करके क्लाइंट की ओर से सर्वर से डेटा पास किया गया

2) public void RaiseCallbackEvent(string eventArgument) EventArgument में हम पास किए गए डेटा को प्राप्त करते हैं // कुछ सर्वर साइड ऑपरेशन करते हैं और "callbackResult" पर जाते हैं

3) GetCallbackResult() // इस पद्धति का उपयोग करके डेटा क्लाइंट (ReceiveServerData () फ़ंक्शन) को पास किया जाएगा

callbackResult

4) ग्राहक की ओर से डेटा प्राप्त करें: ReceiveServerData(text) पाठ सर्वर प्रतिक्रिया में, हमें मिल जाता है।


0

प्रतिनिधि C ++ में इंटरफ़ेस-आधारित कॉलबैक के रूप में एक ही काम करते हैं (COM इन का उपयोग करता है), हालांकि उपयोग करने के लिए बहुत सरल हैं।

ध्यान दें कि Microsoft ने अपने जावा कार्यान्वयन (J ++) में प्रतिनिधियों को रखा था, लेकिन सूर्य उन्हें पसंद नहीं करता [java.sun.com] इसलिए उन्हें जल्द ही किसी भी समय जावा के आधिकारिक संस्करण में देखने की उम्मीद नहीं है। मैंने आपको C ++ में उनका उपयोग करने देने के लिए एक प्रीप्रोसेसर को हैक किया है, इसलिए यदि आप C # या .NET प्लेटफ़ॉर्म (यानी प्रबंधित C ++ या Visual Basic.NET में) पर प्रोग्रामिंग नहीं कर रहे हैं, तो इसे न छोड़ें।

यदि आप C में पॉइंटर्स को कार्य करने के लिए उपयोग कर रहे हैं, तो एक प्रतिनिधि मूल रूप से पॉइंटर्स की एक जोड़ी है जिसे एक में रोल किया गया है:

  • किसी वस्तु का सूचक (वैकल्पिक)
  • उस वस्तु की विधि के लिए एक सूचक

इसका मतलब है कि एक एकल प्रतिनिधि आपके कार्यक्रम में एक फ़ंक्शन का पता लगाने के लिए आवश्यक सभी जानकारी पास करता है, चाहे वह एक स्थिर विधि हो या किसी वस्तु से जुड़ी हो।

आप उन्हें C # में इस तरह परिभाषित करते हैं:

public delegate void FooCallbackType( int a, int b, int c );

जब आप उनका उपयोग करना चाहते हैं, तो आप उस फ़ंक्शन से प्रतिनिधि बनाते हैं जिसे आप कॉल करना चाहते हैं:

class CMyClass
{
    public void FunctionToCall( int a, int b, int c )
    {
        // This is the callback
    }

    public void Foo()
    {
        FooCallbackType myDelegate = new FooCallbackType(
            this.FunctionToCall );
        // Now you can pass that to the function
        // that needs to call you back.
    }
}

यदि आप एक स्थिर विधि को इंगित करने के लिए एक प्रतिनिधि बनाना चाहते हैं, तो यह केवल एक जैसा दिखता है:

class CMyClassWithStaticCallback
{
    public static void StaticFunctionToCall( int a, int b, int c )
    {
        // This is the callback
    }

    public static void Foo()
    {
        FooCallbackType myDelegate = new FooCallbackType(
            CMyClass.StaticFunctionToCall );
    }
}

सभी सब में, वे C ++ में इंटरफ़ेस-आधारित कॉलबैक के रूप में एक ही काम करते हैं, लेकिन थोड़ी कम परेशानी का कारण बनते हैं क्योंकि आपको अपने कार्यों के नामकरण या सहायक ऑब्जेक्ट बनाने के बारे में चिंता करने की आवश्यकता नहीं है, और आप प्रतिनिधियों को किसी भी विधि से बाहर कर सकते हैं। वे अधिक लचीले हैं।

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