Apa itu panggilan balik dan bagaimana penerapannya dalam C #?
Apa itu panggilan balik dan bagaimana penerapannya dalam C #?
Jawaban:
Dalam pemrograman komputer , panggilan balik adalah kode yang dapat dieksekusi yang dilewatkan sebagai argumen ke kode lain.
C # memiliki delegasi untuk tujuan itu. Mereka banyak digunakan dengan acara , karena suatu peristiwa dapat secara otomatis meminta sejumlah delegasi terlampir (penangan acara).
Saya baru saja bertemu dengan Anda,
Dan ini gila,
Tapi ini nomor saya (delegasi),
Jadi jika sesuatu terjadi (peristiwa),
Panggil saya, mungkin (panggilan balik)?
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 delegate
atau semantik lambda baru Func
atau 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));
}
Sebuah callback adalah kode executable yang dilewatkan sebagai argumen untuk kode lain.
// 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
Tautan
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 .
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
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 CallMeBack
metode. Jadi, CallMeBack
metode akan dipanggil. Pada dasarnya, kami melewati delegasi untuk memanggil metode panggilan balik.
Tolong beri tahu saya jika Anda memiliki pertanyaan.
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 .
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.
langkah-langkah kerja panggilan balik:
1) kita harus mengimplementasikan ICallbackEventHandler
Interface
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.
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:
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.