หัดท่า callback กัน
posted on 17 Jun 2008 02:20 by xnanoob in Tutorials
สวัสดีค่า วันนี้หัดท่า Callback Methods กันนะค่ะ
คือเป็นแบบว่าทำงานงานหนึ่งเสร็จแล้วไปเรียกอีกงานหนึ่งแบบอัตโนมัติ โดย .net framework ได้จัดท่านี้ไว้ให้แล้วซึ่งจะใช้ ASyncCallBack กับ delegates เป็นกลไกในการทำงาน (มั่งค่ะ)
ก่อนอื่นต้องมาดูปัญหากันก่อนนะค่ะ ก่อนอื่นขอยกตัวอย่างพวก function
| ReadLine |
| AcceptTcpClient |
Code:
Console.ReadLine();
เพื่อนๆ บางคนอาจจะนึกภาพไม่ค่อยออก ถ้ายังไงคงต้องลองนึกภาพตอนเขียน console แล้วใช้คำสั่ง ReadLine ในการรับ Input เข้ามา โปรแกรมก็จะหยุดรอให้ user รับคำสั่งเข้ามา
ดังนั้นการทำงานบางอย่างถ้าติด function จำพวก blocking นี้จะไม่สามารถทำงานต่อไปได้ แต่หากว่า ต้องการ การหละ ปัญหาแบบนี้ก็ต้องไปใช้ thread ในการแก้ปัญหา ให้ไปประมวลผลแบบขนานกันไป
แต่ความต้องการไม่ได้หยุดเพียงแค่นี้ เราต้องการให้มันทำงานข้ามไปก่อนแต่พอมีการตอบสนองแล้วให้มี action อย่างอื่นตอบสนองกลับมาด้วย ท่านี้เลยเรียกว่า
| Callback |
การ Callback จะใช้การ invoke แต่หละ method โดยผ่านทาง Delegate
โจทย์ตัวอย่าง เราจะส่ง method ไปทำงานหากเสร็จเรียบร้อยแล้วให้ทำการ callback กลับมาบอกด้วยว่าเสร็จเรียบร้อยแล้ว
อ.บอกว่า BeginInvoke นั้นก็เปรียบเสมือน Thread นั้นเองแต่พอเรารวมกับการ callback ไปด้วยแล้วก็จะกลายเป็นว่ามันก็คือ Thread ที่มีการ Callback นั้นเอง
ขั้นแรกก่อนอื่นไปสร้าง delegate ไว้ก่อน
Code:
//ประกาศ delegate รับค่าเป็น string และไม่มีการ return ค่า
public delegate void delegateTest(string s);
public event delegateTest OnTest;
//ประกาศ del เป็น delegate ของ delegateTest
delegateTest del;
public delegate void delegateTest(string s);
public event delegateTest OnTest;
//ประกาศ del เป็น delegate ของ delegateTest
delegateTest del;
เสร็จแล้วก็ทำการ ผูก event กับ delegate อะไรให้เรียบร้อย (ดูตัวอย่างเรื่อง event และ delegate[1][2][3] )
โดยต่อมาให้คุณไปสร้าง methed ที่จะทำหลังจากที่ทำงานเสร็จแล้ว (method ที่โดยเรียกตอน callback) โดย method นี้จะต้องมี signature ดังนี้คือ return ต้องเป็น void ไม่มีการคืนค่าและ parameter ที่ส่งเข้าไปนั้นต้องเป็น type IAsyncResult แสดงได้ดังตัวอย่าง
Code: (ตัวอย่าง method callback)
private void methodCallBack(IAsyncResult iar){....}
หลังจากนั้นทดสอบการทำงานโดยทำการเรียก method สอบแบบ
-แบบแรกเรียกผ่าน event ธรรมดาแบบไม่มี invoke และ callback
-แบบสองเรียกผ่าน event โดยใช้ begininvoke และมี การ callback
Code:
public void process(string s){
// แบบที่สอง
// เรียก method greeting โดยใช้ BeginInvoke ผ่านทาง delegate
// BeginInvoke นั้นก็เปรียบเสมือน Thread แต่มีการ Callback
// OnTest.BeginInvoke(s, new AsyncCallback(ResultsReturned), del);
OnTest.BeginInvoke(s, new AsyncCallback(methodCallBack), del);
// แบบแรก
// เรียก method greeting โดยไม่มี delegate
// OnTest("123");
Console.WriteLine("NEXT");
}
// แบบที่สอง
// เรียก method greeting โดยใช้ BeginInvoke ผ่านทาง delegate
// BeginInvoke นั้นก็เปรียบเสมือน Thread แต่มีการ Callback
// OnTest.BeginInvoke(s, new AsyncCallback(ResultsReturned), del);
OnTest.BeginInvoke(s, new AsyncCallback(methodCallBack), del);
// แบบแรก
// เรียก method greeting โดยไม่มี delegate
// OnTest("123");
Console.WriteLine("NEXT");
}
Code:
OnTest.BeginInvoke(s, new AsyncCallback(methodCallBack), del);
หากคุณเรียก method greeting ผ่านทาง delegate และใช้ begininvoke จะสามารถทะลุผ่านพวก blocking ได้
Code:
OnTest("123");
หากคุณเรียก method greeting ผ่านทาง delegate แต่ไม่มี begininvoke จะไม่สามารถทะลุผ่านพวก blocking ได้ ลองดูก่อนนะค่ะ จบแระค่า บายค่ะ
งุงิ งุงิ
เอกสารอ้างอิง Delegates and Events—Callback Methods
ปล.ดูแบบสีได้ที่ http://www.xnanoob.com/forum/index.php?topic=22.0








