See if this works for you
public static class ControlExtensions
{
/// <summary>
/// Determines if a control needs to be invoked to prevent a cross thread violation. This is a generic
/// extension method
/// </summary>
/// <typeparam name="T">Control</typeparam>
/// <param name="control">Control</param>
/// <param name="action">Predicate to run</param>
/// <example>
/// private void OnTimedEvent(object source, ElapsedEventArgs e)
/// {
/// ElapsedTimerLabel.InvokeIfRequired(label =>
/// {
/// label.Text = $"{e.SignalTime}";
/// });
/// }
/// </code>
/// </example>
public static void InvokeIfRequired<T>(this T control, Action<T> action) where T : ISynchronizeInvoke
{
if (control.InvokeRequired)
{
control.Invoke(new Action(() => action(control)), null);
}
else
{
action(control);
}
}
}
Usage where TODO is where you perform whatever action you want for mbtnArr[i].btn
mbtnArr[i].btn.InvokeIfRequired(label =>
{
// TODO
});