W jakich okolicznościach aktualizacja formantu interfejsu użytkownika z wątku innego niż UI może spowodować ciągłe zwiększenie uchwytów procesów podczas używania delegata i .InvokeRequired
?UI Wątek .Invoke() powodujący wyciek rączki?
Na przykład:
public delegate void DelegateUIUpdate();
private void UIUpdate()
{
if (someControl.InvokeRequired)
{
someControl.Invoke(new DelegateUIUpdate(UIUpdate));
return;
}
// do something with someControl
}
Kiedy to się nazywa w pętli lub w odstępach czasowych, uchwyty dla programu stale wzrastać.
EDIT:
Jeśli powyższe jest wypowiedziało się i wprowadza jako takie:
public delegate void DelegateUIUpdate();
private void UIUpdate()
{
//if (someControl.InvokeRequired)
//{
// someControl.Invoke(new DelegateUIUpdate(UIUpdate));
// return;
//}
CheckForIllegalCrossThreadCalls = false;
// do something with someControl
}
... wtedy uchwyty zatrzymać inkrementację, jednak nie chcę, aby umożliwić krzyż wątek wywołań, oczywiście.
EDIT 2:
Oto przykład, który pokazuje uchwyty zwiększają:
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;
}
Mam ten sam problem tutaj, z dokładnie tym samym wywołaniem zegara. Dziękuję za wzmiankę o CheckForIllegalCrossThreadCalls, ponieważ nigdy wcześniej o tym nie słyszałem. – muusbolla