Это происходит из-за того, что управляемый элемент управления удален и у него больше нет дескриптора, но вы еще не закрыли окно, поэтому вы все еще видите его.
Вы можете создать функцию, которая обернет вызов Invoke
и проверит наличие IsHandleCreated
перед вызовом Invoke
. Если IsHandleCreated
ложно, вы не можете позвонить Invoke
и просто проигнорировать вызов.
public static class ControlExtensions
{
public static TResult InvokeEx<TControl, TResult>(this TControl control,
Func<TControl, TResult> func)
where TControl : Control
{
if (!control.IsHandleCreated)
return default(T);
if (control.InvokeRequired)
return (TResult)control.Invoke(func, control);
else
return func(control);
}
public static void InvokeEx<TControl>(this TControl control,
Action<TControl> action)
where TControl : Control
{
control.InvokeEx(c => { action(c); return c; });
}
}
Так что теперь просто оберните все Invoke
s из ваших потоков с помощью InvokeEx
, и он будет обрабатывать, когда элемент управления был удален и больше не имеет дескриптора.
this.InvokeEx(c => c.label1.Text = "Hello world");