Every .NET WinForms project I've written, since .NET 2.0, has included some form of this code:
public static class ControlExtensions
{
public static void Do<TControl>(this TControl control, Action<TControl> action)
where TControl: Control
{
if (control.InvokeRequired)
control.Invoke(action, control);
else
action(control);
}
}
It's a simple extension method that allows any UI control to update itself when called from an asynchronous method - whether it's running from a .BeginInvoke() call, a BackgroundWorker, a ThreadPool thread, or any other form of asynchronous call. It's simple and effective in managing UI updates from asynchronous methods.
I'm currently using it to update a progress bar, like this:
private void SetProgress(int percentage)
{
updateProgressBar.Do(ctl =>
{
ctl.Value = percentage;
});
}
The best part is that it's aware of the control type through the use of generics. You don't have to cast from a generic Control type so that you can access the specific methods and properties of your specific control type.
Read more: LosTechies
public static class ControlExtensions
{
public static void Do<TControl>(this TControl control, Action<TControl> action)
where TControl: Control
{
if (control.InvokeRequired)
control.Invoke(action, control);
else
action(control);
}
}
It's a simple extension method that allows any UI control to update itself when called from an asynchronous method - whether it's running from a .BeginInvoke() call, a BackgroundWorker, a ThreadPool thread, or any other form of asynchronous call. It's simple and effective in managing UI updates from asynchronous methods.
I'm currently using it to update a progress bar, like this:
private void SetProgress(int percentage)
{
updateProgressBar.Do(ctl =>
{
ctl.Value = percentage;
});
}
The best part is that it's aware of the control type through the use of generics. You don't have to cast from a generic Control type so that you can access the specific methods and properties of your specific control type.
Read more: LosTechies