เมื่อเราเขียนโปรแกรม Remoting หรือแอปพลิเคชันอื่น ๆ เราต้องจัดการกับเธรดอย่างหลีกเลี่ยงไม่ได้ .Net ช่วยให้เราสร้างเธรดได้อย่างง่ายดาย แต่วิธีการที่มีให้สำหรับการสร้างเธรดและเธรดเริ่มต้นไม่มีพารามิเตอร์ที่ชัดเจน ถ้าเรา ฉันควรทำอย่างไร ถ้าฉันต้องการใช้เธรดเพื่อเริ่มวิธีการด้วยพารามิเตอร์ในคลาส? ต่อไปนี้เป็นคำแนะนำโดยย่อเกี่ยวกับวิธีใช้เฟรมเวิร์กที่หลากหลายที่ .NET จัดเตรียมไว้ให้เพื่อใช้ฟังก์ชันนี้ เพื่อที่จะแนะนำกระบวนการทั้งหมดอย่างละเอียด ฉันจึงสร้างคลาส .NET ต่อไปนี้ ซึ่งเป็นพาหะของวิธีการเริ่มต้นเธรดด้วย ชั้นเรียนมีลักษณะดังนี้:
การใช้ระบบ;
namespace WindowsApplication1
{
/// <summary>
/// คำอธิบายโดยย่อสำหรับ UrlFetcher
/// </summary>
คลาสสาธารณะ MyClass{
// สำหรับวิธีที่ 1
สตริงส่วนตัว _parameter;
public MyClass(string parameter){
this._parameter = parameter;
}
public void MyMethod1(){
if(this._parameter!=null){
// do some
Console.Write(this._parameter )
;
// สำหรับวิธีที่ 2
public MyClass(){}
// วิธีนี้เป็นแบบส่วนตัวแต่อาจเป็น
โมฆะแบบสาธารณะหรือแบบส่วนตัว MyMethod2(พารามิเตอร์สตริง){
// ทำบางอย่าง
Console.Write(parameter);
}
// เพราะมอบหมาย WaitCallback's ประเภทพารามิเตอร์คือ object
// ฉันจะแปลงเป็น string.
public void MyMethod2(object parameter){
this.MyMethod2((string)parameter
)
// สำหรับวิธีที่ 3
สตริงสาธารณะ MyMethod3 (พารามิเตอร์สตริง) {
return "ค่าพารามิเตอร์คือ:"+parameter
;
// สำหรับพารามิเตอร์หลายตัวที่ส่งผ่าน
สตริงสาธารณะ MyMutilParameters(string param1,string param2){
return "ผลลัพธ์การเชื่อมต่อของพารามิเตอร์ 1 และพารามิเตอร์ 2 คือ: "+param1+param2
}
}
}
อิอิ ภาษาอังกฤษของฉันไม่ดี โปรดยกโทษให้ฉันด้วยที่เขียนความคิดเห็นไม่ดี (เพราะเป็นภาษาอังกฤษ) ฉันหวังว่ามันจะไม่ส่งผลกระทบต่อการอ่านของคุณ ฉันคิดว่าจำเป็นสำหรับฉันที่จะพูดสั้น ๆ เกี่ยวกับเนื้อหาที่มีอยู่ในชั้นเรียนข้างต้น อย่างแรก มันมีคอนสตรัคเตอร์สองตัว ตัวหนึ่งมีพารามิเตอร์ และอีกตัวหนึ่งไม่มี (นี่คือการจัดเรียงโดยเจตนา) ฉันคิดว่าคุณจะเดาผ่านชื่อของวิธีอื่นในชั้นเรียน ฉันจะแนะนำ 3 วิธีในการส่งพารามิเตอร์ จากนั้นฉันจะแนะนำทีละวิธี ขั้นแรก มาดูวิธีการเริ่มเธรด ขั้นแรก เราสามารถใช้ฟังก์ชันเพื่อสร้างอินสแตนซ์ของผู้รับมอบสิทธิ์ ThreadStart จากนั้นใช้อินสแตนซ์นี้เป็นวัตถุพารามิเตอร์เธรดใหม่ (Thread) และสุดท้ายคือเริ่มเธรด รู้เพิ่มเติม โปรดดูส่วนเธรดของเอกสารประกอบ MSDN สำหรับข้อมูลเพิ่มเติม
เพื่อทดสอบผลลัพธ์ของเรา ฉันได้สร้างโปรเจ็กต์ WinForm ซึ่งมีแบบฟอร์มและปุ่ม 4 ปุ่ม หากคุณต้องการซอร์สโค้ดทั้งหมด โปรดส่งอีเมลไปที่ [email protected] ฉันจะส่งให้คุณหากมีเวลา . ต่อไปนี้เป็นคำอธิบายโดยละเอียดของแต่ละวิธี
1. ใช้ Constructor เพื่อส่งผ่านพารามิเตอร์
ดังที่เราทุกคนทราบ เราสามารถใช้ Constructor พร้อมพารามิเตอร์เพื่อสร้างอ็อบเจ็กต์ได้ ในกรณีนี้ เราสามารถใช้ Constructor เพื่อส่งค่าพารามิเตอร์ที่จะใช้ไปยัง ตัวแปรภายในในวัตถุแล้วใช้วิธีสร้างพารามิเตอร์เพื่อใช้พารามิเตอร์นี้ (แกล้งทำเป็นพารามิเตอร์) พูดง่ายๆ ก็คือประกาศตัวแปรในคลาสโดยเฉพาะเพื่อบันทึกพารามิเตอร์ที่ฟังก์ชันต้องการ และฟังก์ชันจะกลายเป็นรูปแบบที่ไม่มีพารามิเตอร์ ปัญหาใหญ่ที่สุดของวิธีนี้คือทำลายการห่อหุ้ม แม้ว่าเราจะไม่สามารถเข้าถึงตัวแปรเหล่านี้ได้โดยตรง แต่ก็มีอันตรายที่ซ่อนอยู่อยู่เสมอ (หรือไม่สำคัญว่าจะดูไม่น่าพอใจหรือไม่) ข้อมูลโค้ดต่อไปนี้ให้รายละเอียดเกี่ยวกับวิธีการใช้วิธีการนี้เพื่อส่งพารามิเตอร์ นี่เป็นโค้ดคลิกสำหรับปุ่มใดปุ่มหนึ่งจากสี่ปุ่มที่กล่าวถึงข้างต้น (Button1) เพื่อให้พารามิเตอร์สามารถส่งผ่านได้ ฉันได้กำหนดตัวแปรดังต่อไปนี้ใน WinForm:
// นี่คือค่าของพารามิเตอร์
สตริงส่วนตัว myParameter = "ParameterValuen";
เหตุการณ์ของปุ่มจะเป็นดังนี้:
// ส่งพารามิเตอร์ไปยังเธรดโดยสร้าง
ส่วนตัว ถือเป็นโมฆะ button1_Click( object sender, System.EventArgs e) {
MyClass instance = new MyClass(myParameter);
new Thread (new ThreadStart(instance.MyMethod1)).Start();
}
ดังที่ได้กล่าวไว้ข้างต้น เราใช้ Constructor เพื่อส่งผ่านพารามิเตอร์เข้าไป คลาส Go จากนั้นเริ่มเธรดโดยใช้วิธีที่กล่าวข้างต้น เราจะเห็นผลลัพธ์การทำงานของ MyMethod1 ในหน้าต่างเอาต์พุตหลังจากรันโปรแกรม (คุณยังสามารถใช้กล่องข้อความหรืออย่างอื่นเพื่อแสดงโดยตรงบน WinForm) : ค่าพารามิเตอร์ เพียงดูที่ตัวฟังก์ชันแล้วคุณจะเห็นว่าผลลัพธ์ถูกต้อง มันไม่ง่ายเลยเหรอ
2. ใช้ ThreadPool เพื่อรับรู้ถึงการถ่ายโอนพารามิเตอร์
ก่อนอื่นเราจะมาดูกันว่า MSDN อธิบาย ThreadPool อย่างไร ดูการรวบรวมวิธีการ ซึ่งหนึ่งในนั้นเรียกว่า: QueueUserWorkItem สำหรับข้อมูลโดยละเอียดเกี่ยวกับคลาสนี้และวิธีการนี้ โปรดดูวิธีใช้ที่เกี่ยวข้องกับ MSDN สิ่งที่ต้องสังเกตที่นี่คือพารามิเตอร์ของเมธอด QueueUserWorkItem พารามิเตอร์ WaitCallback เป็นประเภทผู้รับมอบสิทธิ์ ของประเภทวัตถุ โปรดดูรหัสด้านล่างเพื่อดูรายละเอียด
// ส่งพารามิเตอร์ไปยังเธรดโดย ThreadPool
ส่วนตัวเป็นโมฆะ button2_Click (ผู้ส่งวัตถุ, System.EventArgs e) {
MyClass instance = new MyClass();
ThreadPool.QueueUserWorkItem (new WaitCallback (instance.MyMethod2), myParameter);
}
เนื่องจากคุณสมบัติทั้งสอง ของ QueueUserWorkItem พารามิเตอร์เป็นประเภทอ็อบเจ็กต์ ดังนั้นเราจำเป็นต้องกำหนด MyMethod2 เวอร์ชันที่ปรับขนาดแล้วสองเวอร์ชันใน MyClass เพื่อให้เป็นไปตามพารามิเตอร์ของเมธอด ในทำนองเดียวกัน เราส่งพารามิเตอร์ myParameter และรันโปรแกรม เมื่อเราคลิก Button2 ผลลัพธ์ของ MyMethod2 ที่รัน myParameter เป็นพารามิเตอร์จะปรากฏในหน้าต่างเอาต์พุต
3. ถัดไปเป็นวิธีสุดท้ายในการใช้การมอบหมายแบบอะซิงโครนัสเพื่อรับรู้การถ่ายโอนพารามิเตอร์
ในทำนองเดียวกัน สำหรับข้อมูลโดยละเอียดเกี่ยวกับการมอบหมาย โปรดดูที่ MSDN ซึ่งมีรายละเอียดมากข้างต้น เราจะใช้เมธอด BeginInvoid และ EndInvoid ที่นี่ ขั้นแรก เราให้วิธีการส่งพารามิเตอร์ดังนี้:
// พารามิเตอร์ที่ส่งผ่านโดย
สตริงผู้รับมอบสิทธิ์แบบอะซิงโครนัส MyMethod3Delegate(พารามิเตอร์
สตริง
)
;
myMethod3 = new MyMethod3Delegate(instance.MyMethod3);
myMethod3.BeginInrigg("parameterValue",new AsyncCallback(AfterMyMothod3),null);
}
โมฆะสาธารณะ AfterMyMothod3(ผลลัพธ์ IAsyncResult){
AsyncResult async = (AsyncResult) ผลลัพธ์;
thod3Delegate) async.AsyncDelegate;
Console.WriteLine ("Function call return value: {0}n", DelegateInstance.EndInvoid(result)
}
อันดับแรก เพื่อใช้ผู้รับมอบสิทธิ์ เราจะประกาศผู้รับมอบสิทธิ์ของ MyMethod3Delegate ซึ่งระบุพารามิเตอร์ และคืนค่าฟังก์ชันที่เป็นสตริงมีสิทธิ์ ดังนั้นเราจึงกำหนดวิธีการ MyMethod3 ใน MyClass โครงสร้างของฟังก์ชันนี้สอดคล้องกับผู้รับมอบสิทธิ์ข้างต้น ดังนั้นเราจึงสามารถใช้วิธีนี้เพื่อสร้างอินสแตนซ์ของผู้รับมอบสิทธิ์เมื่อคลิก Button3 จากนั้นเราเรียกวิธีนี้แบบอะซิงโครนัส เพื่อให้ได้ผลลัพธ์ที่ส่งคืน เราเขียนวิธี AfterMyMothod3 เพื่อแสดง ผลการดำเนินการฟังก์ชัน รันโปรแกรมแล้วคลิก Button3 เพื่อดูว่าผลลัพธ์ใน Output เป็นผลลัพธ์ของการดำเนินการ MyMethod3 พร้อมพารามิเตอร์ สุดท้ายนี้ ฉันให้วิธีการส่งผ่านพารามิเตอร์หลายตัว ตัวอย่างของฉันคือการส่งผ่านพารามิเตอร์ 2 ตัว รหัสดังต่อไปนี้:
// mutil-parameters ส่งผ่าน
สตริงผู้รับมอบสิทธิ์ MyMutilParamsDelegate (พารามิเตอร์สตริง 1, พารามิเตอร์สตริง 2);
โมฆะส่วนตัว button4_Click (ผู้ส่งวัตถุ, System.EventArgs e) {
อินสแตนซ์ MyClass =ใหม่
MyClass ();
instance.MyMutilParameters );
mutilParams.BeginInvoke("param1", "params2", AsyncCallback ใหม่ (AfterMutilParams), null
}
โมฆะสาธารณะ AfterMutilParams (ผลลัพธ์ IAsyncResult) {
AsyncResult async = (AsyncResult) ผลลัพธ์;
MyMutilParamsDelegate DelegateInstance = (MyMutilParamsDelegate) async.AsyncDelegate;
Console.WriteLine ("ผลลัพธ์การเรียกฟังก์ชันหลายพารามิเตอร์: {0}n", DelegateInstance.EndInrigg ผลลัพธ์ ));
}
เนื่องจากข้อจำกัดด้านพื้นที่ โค้ดจึงไม่สามารถอธิบายได้อย่างละเอียด โปรดแก้ไขฉันหากมีข้อผิดพลาดใด ๆ ขอบคุณที่อ่าน! ข้อมูลการติดต่อ: [email protected] รหัสฟอรัม CSDN: cuike519
เอกสารอ้างอิง: