รหัสต่อไปนี้ใช้เพื่อทริกเกอร์การเรียกใช้ (รหัสลดลง ฉันละทิ้งการจัดการข้อผิดพลาดในตัวอย่างนี้เพื่อให้ชัดเจนยิ่งขึ้น)
public static void InvokeIfNecessary(this Control control, MethodInvoker methodInvoker)
{
if (control != null && !control.IsDisposed && !control.Disposing)
{
if (control.InvokeRequired)
{
control.Invoke(methodInvoker);
}
else
{
methodInvoker();
}
}
}
โดยปกติแล้วมันใช้งานได้ดี แต่บางครั้งถ้าฉันเรียกเมธอดของแบบฟอร์มก็จะได้รับ InvalidOperationException วิธีแผนผังที่จะเรียก
// in a Frm2:
internal void UpdateSomething()
{
List<NO> myObjects = frmMain.NO.GetNOs();
if (null != myObjects)
{
this.InvokeIfNecessary(() =>
{
layoutControlGroup.BeginUpdate(); // DevExpress Layoutcontrolgroup
foreach (NO aObject in myObjects)
{
if(...) // if already a control for the object exist update it.
{
// update
}
else
{
// add item
LayoutControlItem layoutControlItem = new LayoutControlItem();
// create new control
Control control = CreateNewControl(aObject);
layoutControlItem.Control = control;
// do some stuff with visibility and size of control
...
layoutControlGroup.AddItem(layoutControlItem); // <-- And here the InvalidOperationException occurs.
/// The message is (translated
/// InvalidOperationException was not handled by usercode
/// The acces on the Control FrmMain was done from another Thrad then the thread which created it.
...;
}
}
...;
layoutControlGroupCA.EndUpdate();
});
}
}
คือ... ฉันต้องยอมรับว่าฉันมีปัญหาด้านแนวคิดที่นี่
เหตุใดจึงมีข้อยกเว้นถูกส่งมาที่นี่
วิธีการ Frm2 สร้างองค์ประกอบใหม่ (ใน NO มีเพียงสตริงและโครงสร้างที่มีสตริงและบูล) องค์ประกอบสามารถเข้าถึงได้ภายในเมธอด UpdateSomething() เท่านั้น lalayOutControlGroup เป็นสมาชิกของ Frm2
ดังนั้นในความคิดของฉัน ควรแนบการควบคุมใหม่ซึ่งควรสร้างขึ้นในเธรด Frm2 กับการควบคุมเฉพาะของ Frm2 เท่านั้น
แล้วทำไมมันถึงยืนกรานใน FrmMain? (แบบฟอร์มหลักซึ่งเรียกวิธีการของแบบฟอร์มแจ้งการอัพเดตรายการ)
ป.ล. this.InvokeIfRequired ‹- นี่คือ Frm2 จริงๆ แล้ว...
Invoke
หากคุณไม่ได้อยู่ในเธรด UI หากคุณตรวจสอบอยู่ตลอดเวลาแม้ว่าคุณจะรู้ว่าคุณจะต้องเรียกใช้มันซึ่งสิ้นเปลือง และบางครั้งก็ทำให้คุณลำบากในบางกรณีที่InvokeRequired
เป็นเท็จ แต่คุณจำเป็นต้องInvoke
จริงๆ - person Servy   schedule 06.06.2013