public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//на форме расположен TextBox и Button.
//В TextBox будет выводиться количество сработок таймера,
//таймер запускается по нажатию на кнопку Button
timer = new Timer(AsyncHandler);
}
private void button1_Click(object sender, EventArgs e)
{
timer.Change(1000, 1000);
}
private void AsyncHandler(object data)
{
tickCount++;
textBox1.Text = tickCount.ToString();
}
private readonly System.Threading.Timer timer;
private int tickCount;
}
private void AsyncHandler(object data)
{
tickCount++;
Action<int> action = DoChangeTicks;
if (InvokeRequired)
{
Invoke(action, tickCount);
}
else
{
action(tickCount);
}
}
private void DoChangeTicks(int count)
{
textBox1.Text = tickCount.ToString();
}
private void AsyncHandler(object data)
{
tickCount++;
Action action = () => textBox1.Text = tickCount.ToString();
if (InvokeRequired)
{
Invoke(action);
}
else
{
action();
}
}
/// <summary>
/// Расширения облегчающие работу с элементами управления в многопоточной среде.
/// </summary>
public static class ControlExtentions
{
/// <summary>
/// Вызов делегата через control.Invoke, если это необходимо.
/// </summary>
/// <param name="control">Элемент управления</param>
/// <param name="doit">Делегат с некоторым действием</param>
public static void InvokeIfNeeded(this Control control, Action doit)
{
if (control.InvokeRequired)
control.Invoke(doit);
else
doit();
}
/// <summary>
/// Вызов делегата через control.Invoke, если это необходимо.
/// </summary>
/// <typeparam name="T">Тип параметра делегата</typeparam>
/// <param name="control">Элемент управления</param>
/// <param name="doit">Делегат с некоторым действием</param>
/// <param name="arg">Аргумент делагата с действием</param>
public static void InvokeIfNeeded<T>(this Control control, Action<T> doit, T arg)
{
if (control.InvokeRequired)
control.Invoke(doit, arg);
else
doit(arg);
}
}
private void AsyncHandler(object data)
{
tickCount++;
this.InvokeIfNeeded(
() => textBox1.Text = tickCount.ToString()
);
}