kode berikut digunakan untuk memicu pemanggilan (kode dikurangi, saya mengabaikan penanganan kesalahan dalam contoh ini agar lebih jelas)
public static void InvokeIfNecessary(this Control control, MethodInvoker methodInvoker)
{
if (control != null && !control.IsDisposed && !control.Disposing)
{
if (control.InvokeRequired)
{
control.Invoke(methodInvoker);
}
else
{
methodInvoker();
}
}
}
Biasanya ini berfungsi dengan baik, tetapi terkadang jika saya memanggil metode Formulir, InvalidOperationException diberikan. Metode skematis yang akan dipanggil
// 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();
});
}
}
Yah... Saya harus mengakui bahwa saya memiliki masalah konseptual di sini.
Mengapa Pengecualian dilempar ke sini?
Metode Frm2 membuat elemen baru (Dalam NO hanya ada string dan struct dengan string dan bool). Elemen ini hanya diakses dalam metode UpdateSomething(). LayOutControlGroup adalah anggota Frm2.
Jadi menurut saya hanya Kontrol baru yang harus dibuat di Thread Frm2 yang harus dilampirkan ke Kontrol khusus Frm2.
Jadi mengapa ia bersikeras pada FrmMain? (formulir utama, yang memanggil metode formulir untuk menginformasikan tentang pembaruan item)
P.S. this.InvokeIfRequired ‹- ini sebenarnya Frm2...
Invoke
, jika iya, jangan. Jika Anda terus-menerus memeriksa bahkan ketika Anda tahu Anda harus memanggilnya, itu hanya sia-sia, dan kadang-kadang menyusahkan Anda dalam beberapa kasus di manaInvokeRequired
salah tetapi Anda benar-benar perluInvoke
. - person Servy   schedule 06.06.2013