Dans quelles circonstances la mise à jour d'un contrôle d'interface utilisateur à partir d'un thread non UI peut-elle entraîner une augmentation continue des handles des processus, lors de l'utilisation d'un délégué et .InvokeRequired
?Thread UI .Invoke() provoquant une fuite du handle?
Par exemple:
public delegate void DelegateUIUpdate();
private void UIUpdate()
{
if (someControl.InvokeRequired)
{
someControl.Invoke(new DelegateUIUpdate(UIUpdate));
return;
}
// do something with someControl
}
Lorsque cela est appelé dans une boucle ou sur des intervalles de minuterie, les poignées du programme augmentent constamment.
EDIT:
Si ce qui précède est commenté et modifié en tant que tel:
public delegate void DelegateUIUpdate();
private void UIUpdate()
{
//if (someControl.InvokeRequired)
//{
// someControl.Invoke(new DelegateUIUpdate(UIUpdate));
// return;
//}
CheckForIllegalCrossThreadCalls = false;
// do something with someControl
}
... alors les poignées arrêter incrémenter, mais je ne veux pas laisser croix thread appels, bien sûr.
EDIT 2:
Voici un exemple qui montre les poignées augmentent:
Thread thread;
private delegate void UpdateGUI();
bool UpdateTheGui = false;
public Form1()
{
InitializeComponent();
thread = new Thread(new ThreadStart(MyThreadLoop));
thread.Start();
}
private void MyThreadLoop()
{
while (true)
{
Thread.Sleep(500);
if (UpdateTheGui)
{
UpdateTheGui = false;
UpdateTheGuiNow();
}
}
}
private void UpdateTheGuiNow()
{
if (label1.InvokeRequired)
{
label1.Invoke(new UpdateGUI(UpdateTheGuiNow));
return;
}
label1.Text = DateTime.Now.ToString("MM-dd-yyyy HH:mm:ss");
label2.Text = DateTime.Now.ToString("MM-dd-yyyy HH:mm:ss");
label3.Text = DateTime.Now.ToString("MM-dd-yyyy HH:mm:ss");
}
private void btnInvoke_Click(object sender, EventArgs e)
{
UpdateTheGui = true;
}
J'ai le même problème ici, avec exactement le même appel sur une minuterie. Merci d'avoir mentionné CheckForIllegalCrossThreadCalls parce que je n'en avais jamais entendu parler auparavant. – muusbolla