หัดท่า callback กัน

posted on 17 Jun 2008 02:20 by xnanoob  in Tutorials

 

 

 

 

 

สวัสดีค่า วันนี้หัดท่า Callback Methods กันนะค่ะ
คือเป็นแบบว่าทำงานงานหนึ่งเสร็จแล้วไปเรียกอีกงานหนึ่งแบบอัตโนมัติ โดย .net framework ได้จัดท่านี้ไว้ให้แล้วซึ่งจะใช้ ASyncCallBack กับ delegates เป็นกลไกในการทำงาน (มั่งค่ะ)

ก่อนอื่นต้องมาดูปัญหากันก่อนนะค่ะ ก่อนอื่นขอยกตัวอย่างพวก function

ReadLine
 หรือ function
AcceptTcpClient
 จะมีสิ่งที่เรียกว่า blocking แบบว่าตอน runtime จะต้องมีการรอหรือตอบสนองเข้ามาก่อนถึงจะผ่านหรือไปประมวลผลต่อไปได้

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;

เสร็จแล้วก็ทำการ ผูก 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");
        }

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
เช่าห้อง ห้องเช่า อาร์พเม้นต์ apartment 

Comment



smilebig smileopen-mounthed smileconfused smilesad smileangry smiletonguequestionembarrassedsurprised smilewinkdouble winkcry