これは、管理対象のコントロールが破棄され、ハンドルがなくなったが、まだウィンドウが閉じていないために表示されるためです。
Invoke
コールをラップする関数を作成し、Invoke
を呼び出す前にIsHandleCreated
をチェックします。 IsHandleCreated
がfalseの場合は、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; });
}
}
だから今だけInvokeEx
であなたのスレッドから任意のInvoke
Sをラップし、コントロールが配置され、もはやハンドルを持ってきたとき、それが処理されます。
this.InvokeEx(c => c.label1.Text = "Hello world");