Потокобезопасность WinForms в несколько строчек

25 Авг
2011

В продолжении статьи о методах расширения C#, напишу об очень полезном расширении которое сильно облегчит жизнь разработчику при разработке WinForm приложения.

Есть WinForm приложение с TextBox. Необходимо изменить его текст из другого потока приложения. Пример из MSDN‘a:

private void setTextSafeBtn_Click(
			object sender, 
			EventArgs e)
		{
			this.demoThread = 
				new Thread(new ThreadStart(this.ThreadProcSafe));

			this.demoThread.Start();
		}
		private void ThreadProcSafe()
		{
			this.SetText("This text was set safely.");
		}
private void SetText(string text)
		{
			if (this.textBox1.InvokeRequired)
			{	
				SetTextCallback d = new SetTextCallback(SetText);
				this.Invoke(d, new object[] { text });
			}
			else
			{
				this.textBox1.Text = text;
			}
		}

Теперь попробуем по другому.

Первым делаем расширяем класс System.Windows.Forms.Control.

public static class GUIExtensions
    {
        public delegate void InvokeHandler();

        public static void SafeInvoke(this System.Windows.Forms.Control control, InvokeHandler handler)
        {
            if (control.InvokeRequired)
            {
                control.Invoke(handler);
            }
            else
            {
                handler();
            }
        }
    }

Переписываем пример из MSDN’a

private void setTextSafeBtn_Click(object sender, EventArgs e)
{
      this.textBox1.SafeInvoke(() => { textBox1.Text = "This text was set safely."; });
}

И все.
Теперь в любом месте (событие, публичный метод) можно с легкостью манипулировать контролами в WinForm приложении.

Оставить комментарий или два

Наверх
Rambler's Top100