ฉันมีสถานการณ์ (แบบฟอร์ม Windows, C #, .NET)
- มีรูปแบบหลักที่โฮสต์การควบคุมผู้ใช้บางส่วน
- การควบคุมผู้ใช้ดำเนินการกับข้อมูลจำนวนมากเช่นถ้าฉันเรียก
UserControl_Load
วิธีการโดยตรงUI จะไม่ตอบสนองต่อช่วงเวลาสำหรับการดำเนินการตามวิธีโหลด - เพื่อเอาชนะสิ่งนี้ฉันโหลดข้อมูลในเธรดอื่น (พยายามเปลี่ยนรหัสที่มีอยู่ให้น้อยที่สุดเท่าที่จะทำได้)
- ฉันใช้เธรดผู้ทำงานเบื้องหลังซึ่งจะโหลดข้อมูลและเมื่อเสร็จแล้วจะแจ้งให้แอปพลิเคชันทราบว่าได้ทำงานเสร็จแล้ว
- ตอนนี้เป็นปัญหาจริง UI ทั้งหมด (ฟอร์มหลักและส่วนควบคุมย่อยผู้ใช้) ถูกสร้างขึ้นบนเธรดหลักหลัก ในวิธีโหลดของการควบคุมผู้ใช้ฉันกำลังดึงข้อมูลตามค่าของการควบคุมบางอย่าง (เช่นกล่องข้อความ) ใน userControl
รหัสเทียมจะมีลักษณะเช่นนี้:
รหัส 1
UserContrl1_LoadDataMethod()
{
if (textbox1.text == "MyName") // This gives exception
{
//Load data corresponding to "MyName".
//Populate a globale variable List<string> which will be binded to grid at some later stage.
}
}
ข้อยกเว้นที่ให้ไว้คือ
การดำเนินการข้ามเธรดไม่ถูกต้อง: การควบคุมการเข้าถึงจากเธรดอื่นที่ไม่ใช่เธรดที่สร้างขึ้น
หากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ฉันได้ทำ Google และมีข้อเสนอแนะเกิดขึ้นเช่นใช้รหัสต่อไปนี้
รหัส 2
UserContrl1_LoadDataMethod()
{
if (InvokeRequired) // Line #1
{
this.Invoke(new MethodInvoker(UserContrl1_LoadDataMethod));
return;
}
if (textbox1.text == "MyName") // Now it wont give an exception
{
//Load data correspondin to "MyName"
//Populate a globale variable List<string> which will be binded to grid at some later stage
}
}
แต่ ... แต่ดูเหมือนว่าฉันจะกลับไปที่หนึ่งตาราง แอปพลิเคชันไม่ตอบสนองอีกครั้ง ดูเหมือนว่าจะเกิดจากการดำเนินการของบรรทัด # 1 หากเงื่อนไข งานโหลดเสร็จแล้วอีกครั้งโดยผู้ปกครองด้ายและไม่ใช่ที่สามที่ฉันวางไข่
ฉันไม่รู้ว่าฉันเข้าใจถูกหรือผิด ฉันใหม่เพื่อเธรด
ฉันจะแก้ไขปัญหานี้และอะไรคือผลของการใช้งาน Line # 1 if block
สถานการณ์คือสิ่งนี้ : ฉันต้องการโหลดข้อมูลลงในตัวแปรโกลบอลตามค่าของการควบคุม ฉันไม่ต้องการเปลี่ยนค่าของตัวควบคุมจากเธรดลูก ฉันจะไม่ทำมันจากด้ายเด็ก
ดังนั้นการเข้าถึงค่าเพื่อให้สามารถดึงข้อมูลที่เกี่ยวข้องจากฐานข้อมูล