Apa itu callback?

139

Apa itu panggilan balik dan bagaimana penerapannya dalam C #?

cam
sumber
Apakah Anda mengacu pada panggilan balik ASP.Net atau mendelegasikan parameter panggilan balik?
SLaks
8
Itu bisa berarti sejumlah hal - dalam konteks apa Anda mendengarnya?
UpTheCreek
1
Saya pikir dia berbicara tentang Async. Callback
George Johnston
8
-1 Pertanyaannya tidak jelas (tidak cukup detail).
serhio
1
Anda harus bertanya kepada Google untuk pertanyaan yang pasti.
Ozgur Dogus

Jawaban:

123

Dalam pemrograman komputer , panggilan balik adalah kode yang dapat dieksekusi yang dilewatkan sebagai argumen ke kode lain.

- Wikipedia: Callback (ilmu komputer)

C # memiliki delegasi untuk tujuan itu. Mereka banyak digunakan dengan acara , karena suatu peristiwa dapat secara otomatis meminta sejumlah delegasi terlampir (penangan acara).

Joey
sumber
10
sebenarnya panggilan balik adalah penunjuk ke kode yang dapat dieksekusi yang diteruskan sebagai argumen ke kode lain ... halaman tersebut perlu ditinjau
Gianluca Ghettini
8
@ G_G: Tidak ada yang mengatakan itu harus menjadi pointer. Biasanya karena segmen data tidak dapat dieksekusi, tapi itu secara teknis detail implementasi.
Joey
Joey: kamu benar itu adalah detail implementasi tetapi bahkan callback adalah detail implementasi. Anda dapat menulis ulang kode Anda tanpa menggunakan satu panggilan balik pun. Ini seperti 'sementara' vs 'untuk'.
Gianluca Ghettini
1053

Saya baru saja bertemu dengan Anda,
Dan ini gila,
Tapi ini nomor saya (delegasi),
Jadi jika sesuatu terjadi (peristiwa),
Panggil saya, mungkin (panggilan balik)?

LightStriker
sumber
33
Penjelasan yang sangat keren. Saya akan menggunakan penjelasan ini setiap kali seseorang bertanya, harap saya bisa mendapatkan hak untuk menggunakannya?
Nikola Davidovic
15
+1: Senang. Itu merusak lagu, tetapi seharusnya berbunyi `Tapi ini nomor saya dan instruksi untuk menggunakan tipe ponsel tertentu (delegasi) '
Gone Coding
8
Belajar mendelegasikan dengan Smile di wajah Anda :-)
Aakash
8
Penjelasan terbaik!
zhengtonic
3
Perhatikan bahwa delegasi mengajar kepada orang lain dengan penjelasan itu hanya bekerja dengan koreografi yang bagus :)
Sébastien Sevrin
87

Panggilan balik adalah fungsi yang akan dipanggil ketika suatu proses dilakukan menjalankan tugas tertentu.

Penggunaan panggilan balik biasanya dalam logika asinkron.

Untuk membuat panggilan balik di C #, Anda perlu menyimpan alamat fungsi di dalam variabel. Hal ini dicapai dengan menggunakan delegateatau semantik lambda baru Funcatau 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);
    }

Di hari ini C #, ini bisa dilakukan menggunakan lambda seperti:

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

    public void Test()
    {
        DoWork((result) => Console.WriteLine(result));
    }
Pierre-Alain Vigeant
sumber
49

Definisi

Sebuah callback adalah kode executable yang dilewatkan sebagai argumen untuk kode lain.

Penerapan

// 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();
    }
}

Pemakaian

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

Tautan

serhio
sumber
2
hai @ hio terima kasih atas jawaban Anda. itu masih agak suram bagi saya: di mana tepatnya kode dilewatkan sebagai argumen ke kode lain Tampaknya menjadi penambahan metode Peter.Read ke delegasi anak?
BKSpurgeon
1
@serhio link mati.
Yudas
10

Panggilan balik adalah penunjuk fungsi yang Anda berikan ke fungsi lain. Fungsi yang Anda panggil akan 'memanggil kembali' (mengeksekusi) fungsi lain ketika telah selesai.

Lihat tautan ini .

TLiebe
sumber
2
Callback dapat diimplementasikan sebagai delegasi ke suatu metode, tetapi Anda bisa juga mengatakan bahwa meneruskan objek yang mendukung metode callback pada antarmuka adalah callback.
Joe
Array.Sort (arrayObject); memanggil obj.CompareTo (anotherObj) pada elemen-elemen dari arrayObject adalah contoh klasik dari callback menggunakan Interface (ICompareable) di .Net.
Ron5504
8

Jika Anda merujuk ke panggilan balik ASP.Net:

Dalam model default untuk halaman Web ASP.NET, pengguna berinteraksi dengan halaman dan mengklik tombol atau melakukan beberapa tindakan lain yang menghasilkan postback. Halaman dan kontrolnya dibuat kembali, kode halaman berjalan di server, dan versi halaman yang baru diberikan ke browser. Namun, dalam beberapa situasi, berguna untuk menjalankan kode server dari klien tanpa melakukan postback. Jika skrip klien di halaman mempertahankan beberapa informasi status (misalnya, nilai variabel lokal), memposting halaman dan mendapatkan salinan baru akan merusak status itu. Selain itu, postback halaman memperkenalkan pemrosesan overhead yang dapat menurunkan kinerja dan memaksa pengguna untuk menunggu halaman diproses dan dibuat kembali.

Untuk menghindari kehilangan status klien dan tidak perlu memproses overhead dari pulang-pergi server, Anda dapat membuat kode halaman Web ASP.NET sehingga dapat melakukan panggilan balik klien. Dalam panggilan balik klien, fungsi skrip klien mengirim permintaan ke halaman Web ASP.NET. Halaman Web menjalankan versi modifikasi dari siklus hidup normalnya. Halaman dimulai dan kontrolnya dan anggota lain dibuat, dan kemudian metode yang ditandai khusus dipanggil. Metode melakukan pemrosesan yang telah Anda kodekan dan kemudian mengembalikan nilai ke browser yang dapat dibaca oleh fungsi skrip klien lain. Sepanjang proses ini, halaman tersebut aktif di browser.

Sumber: http://msdn.microsoft.com/en-us/library/ms178208.aspx

Jika Anda merujuk ke callback dalam kode:

Callback sering didelegasikan ke metode yang dipanggil ketika operasi tertentu telah menyelesaikan atau melakukan sub-aksi. Anda akan sering menemukannya dalam operasi asinkron. Ini adalah prinsip pemrograman yang dapat Anda temukan di hampir setiap bahasa pengkodean.

Info lebih lanjut di sini: http://msdn.microsoft.com/en-us/library/ms173172.aspx

Zyphrax
sumber
4

Dedikasi untuk LightStriker:
Kode Contoh:

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();
    }       
}

Penjelasan Kode:

Saya membuat kode untuk mengimplementasikan penjelasan lucu yang diberikan oleh LightStriker di salah satu balasan di atas. Kami memberikan delegasi (angka) ke metode ( MetYourCrush). Jika Tertarik (peristiwa) terjadi dalam metode ( MetYourCrush) maka akan memanggil delegasi (nomor) yang memegang referensi CallMeBackmetode. Jadi, CallMeBackmetode akan dipanggil. Pada dasarnya, kami melewati delegasi untuk memanggil metode panggilan balik.

Tolong beri tahu saya jika Anda memiliki pertanyaan.

Mani
sumber
Ini tidak cukup menjawab pertanyaan, dapatkah Anda menjelaskan apa yang kode Anda lakukan, untuk menggambarkan cara kerja panggilan balik, dan bagaimana penerapannya dalam C #.
Adam
Hai Adam, Terima kasih atas balasan Anda. Saya membuat kode untuk mengimplementasikan penjelasan lucu yang diberikan oleh LightStriker. Kami memberikan delegasi (angka) ke metode (MetYourCrush). Jika Tertarik (acara) terjadi dalam metode (MetYourCrush) maka akan memanggil delegasi (nomor) yang memegang referensi metode CallMeBack. Jadi, metode CallMeBack akan dipanggil. Pada dasarnya, kami melewati delegasi untuk memanggil metode panggilan balik. Tolong beri tahu saya jika Anda memiliki pertanyaan.
Mani
1

Mungkin bukan definisi kamus, tetapi panggilan balik biasanya merujuk ke fungsi, yang eksternal untuk objek tertentu, disimpan dan kemudian dipanggil pada acara tertentu.

Contohnya adalah ketika tombol UI dibuat, ia menyimpan referensi ke fungsi yang melakukan tindakan. Tindakan ditangani oleh bagian kode yang berbeda tetapi ketika tombol ditekan, panggilan balik dipanggil dan ini meminta tindakan untuk melakukan.

C #, daripada menggunakan istilah 'callback' menggunakan 'acara' dan 'delegasi' dan Anda dapat mengetahui lebih lanjut tentang delegasi di sini .

Antony Woods
sumber
0

Panggilan balik memungkinkan Anda memberikan kode yang dapat dieksekusi sebagai argumen ke kode lain. Dalam C dan C ++ ini diimplementasikan sebagai pointer fungsi. Di .NET Anda akan menggunakan delegasi untuk mengelola pointer fungsi.

Beberapa kegunaan termasuk kesalahan pensinyalan dan pengendalian apakah suatu fungsi bertindak atau tidak.

Wikipedia

David
sumber
0

langkah-langkah kerja panggilan balik:

1) kita harus mengimplementasikan ICallbackEventHandlerInterface

2) Daftarkan skrip klien:

 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) dari panggilan UI Fungsi klik panggilan javascript panggilan ONClient untuk EX: - builpopup(p1,p2,p3...)

var finalfield = p1, p2, p3; UseCallBack(finalfield, ""); data dari klien diteruskan ke sisi server dengan menggunakan UseCallBack

2) public void RaiseCallbackEvent(string eventArgument) Dalam eventArgument, kami mendapatkan data yang diteruskan // lakukan beberapa operasi sisi server dan diteruskan ke "callbackResult"

3) GetCallbackResult() // menggunakan metode ini, data akan dikirimkan ke sisi klien (fungsi ReceiveServerData ())

callbackResult

4) Dapatkan data di sisi klien:, ReceiveServerData(text) dalam respons server teks, kami akan dapatkan.

Ganesha
sumber
0

Delegasi melakukan hal yang sama dengan callback berbasis antarmuka di C ++ (COM menggunakan ini), meskipun jauh lebih mudah digunakan.

Perhatikan bahwa Microsoft menempatkan delegasi ke dalam implementasi Java-nya (J ++) tetapi Sun tidak menyukainya [java.sun.com] jadi jangan berharap untuk melihatnya dalam versi resmi Java dalam waktu dekat. Saya telah meretas preprocessor untuk membiarkan Anda menggunakannya dalam C ++, jadi jangan merasa tersisih jika Anda tidak memprogram dalam C # atau pada platform .NET (yaitu dalam Managed C ++ atau Visual Basic.NET).

Jika Anda terbiasa memfungsikan pointer dalam C, delegasi pada dasarnya adalah sepasang pointer yang digabung menjadi satu:

  • Penunjuk ke objek (opsional)
  • Penunjuk ke metode objek itu

Itu berarti satu delegasi melewati semua informasi yang diperlukan untuk menemukan fungsi dalam program Anda, apakah itu metode statis atau terkait dengan suatu objek.

Anda mendefinisikannya seperti ini di C #:

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

Saat Anda ingin menggunakannya, Anda membuat delegasi keluar dari fungsi yang ingin Anda panggil:

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.
    }
}

Jika Anda ingin membuat delegasi untuk menunjuk ke metode statis, itu hanya terlihat sama:

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 );
    }
}

Secara keseluruhan, mereka melakukan hal yang sama dengan panggilan balik berbasis antarmuka di C ++, tetapi menyebabkan masalah sedikit lebih sedikit karena Anda tidak perlu khawatir tentang penamaan fungsi Anda atau membuat objek pembantu, dan Anda dapat membuat delegasi keluar dari metode apa pun. Mereka lebih fleksibel.

Gomathi
sumber