C# — Работа с таймером C# (WinForms)


Работа с классом таймера в C#

Научиться использовать класс таймера для обеспечения динамики в программе. Надлежит выяснить, как объявлять таймер, а также запускать ту или иную процедуру по событию от таймера. В качестве приложения с таймером в этом занятии реализована программа «бегущая строка». Более подробную информацию можно получить в [9].

Краткие теоретические сведения

Таймер — это механизм, который позволяет через указанное время многократно активизировать некоторую процедуру. Работу с таймером мы проводили и в Java, и в JavaScript. Рассмотрим, как реализовать бегущую строку на форме. Для этого разместим на форме две кнопки, одна из которых запускает бегущую строку (StartTimer (рис. 4.10)).

Рис. 4.10. Форма для демонстрации бегущей строки

Для работы с таймером необходимо подключить следующие библиотеки:

using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Threading;

Последняя из этого списка как раз и содержит класс Timer. Объявим переменную t класса Timer, а также саму бегущую строку и ее координаты в классе так:

public string str; public int xcoord;

public int ycoord;

private System.Threading.Timer t;

Объявление переменной класса таймера должно полностью определять путь к этому классу. Например, не пройдет такое указание:

private Timer t;

Теперь запрограммируем кнопку для запуска таймера так:

private void buttonl_Click(object sender, System.EventArgs e)

System.Threading.TimerCallback tc=new System.Threading.TimerCallback(showstr); t= new System.Threading.Timer(tc,null,100,350);

Здесь используется так называемый класс delegate (делегат) TimerCallback, которому следует передать в качестве аргумента название метода, запускаемого по таймеру, что, собственно, и объявляет инструкция:

t= new System.Threading.Timer(tc,null,100,350);

Инструкция указывает, что таймер следует запустить через 100 мс первый раз, а затем запускать каждые 350 мс. Метод showstr() выводит строку на экран и объявляется таким образом:

public void showstr(Object state)

Graphics g = this.CreateGraphics(); this.Refresh();

Font drawFont = new Font(«Times New Roman», 16);

Вывод строки производит команда:

Ее аргументами являются выводимая строка str, шрифт — drawFont, кисть (цвет) — drawBrush и координаты. Переменные drawFont и drawBrush созданы с помощью своих конструкторов так:

Font drawFont = new Font(«Times New Roman», 16);

После отображения строки увеличиваем координату по оси X для последующего вывода строки при очередном срабатывании таймера. Отметим также, что прежде чем рисовать строку, нужно очистить форму по команде: this.Refresh();

Отображение текста, как и рисование, выполняется на базе методов класса Graphics. Поэтому мы создали переменную графического контекста таким образом:

Graphics g = this.CreateGraphics();

Наконец, объявление метода showstr() требует обязательно указывать в качестве аргумента переменную типа object (таково свойство делегатов).

Кнопка ClearForm запрограммирована таким образом:

private void button2_Click(object sender, System.EventArgs e)

t.Dispose(); //удаление таймера

Во-первых, она очищает экран, а во-вторых, производит уничтожение таймера: t. Dispose () и его деинициализацию: t=nuii.

Суммируя все сказанное, получаем следующую итоговую программу (листинг 4.16).

Листинг 4.16. Приложение типа «бегущая строка»

using System; using System.Drawing;

using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Threading;

/// Summary description for Forml.

public class Forml : System.Windows.Forms.Form <

public string str;

public int xcoord;

public int ycoord;

private System.Threading.Timer t;

private System.Windows.Forms.Button buttonl;

private System.Windows.Forms.Button button2;

/// Required designer variable.

private System.ComponentModel.Container components = null; public Forml()

// Required for Windows Form Designer support //

InitializeComponent(); str=»Hello»; xcoord=20; ycoord=100;

// TODO: Add any constructor code after InitializeComponent // call //

/// Clean up any resources being used.

public void showstr(Object state)

Graphics g = this.CreateGraphics(); this.Refresh();

Font drawFont = new Font(«Times New Roman», 16);

protected override void Dispose( bool disposing )

if (components != null)

#region Windows Form Designer generated code ///

/// Required method for Designer support – do not modify /// the contents of this method with the code editor.

private void InitializeComponent()

this.buttonl = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); this.SuspendLayout();

this.buttonl.Location = new System.Drawing.Point(16, 232); this.buttonl.Name = «buttonl»;

this.buttonl.Size = new System.Drawing.Size(72, 32); this.buttonl.TabIndex = 0; this.buttonl.Text = «StartTimer»;

this.button2.Location = new System.Drawing.Point(120, 232); this.button2.Name = «button2»;

this.button2.Size = new System.Drawing.Size(88, 32);

this.button2.Click += new System.EventHandler(this.button2_Click);

this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);

this.ClientSize = new System.Drawing.Size(292, 273);

/// The main entry point for the application.

[STAThread] static void Main()

private void buttonl_Click(object sender, System.EventArgs e)

System.Threading.TimerCallback tc=new System.Threading.TimerCallback(showstr); t= new System.Threading.Timer(tc,null,100,350);

private void button2_Click(object sender, System.EventArgs e)

this.Refresh(); t.Dispose(); t=null;

xcoord=20; // Вьшод строки стартует с этой координаты

□ две бегущие строки;

Источник: Герман О. B., Герман Ю. О., Программирование на Java и C# для студента. — СПб.: БХВ-Петербург, 2005. — 512 c.: ил.

Программа «Таймер» Windows Forms

Здравствуйте,помогите пожалуйста описать(комментарии) каждое действие данного кода.


private : System :: Void Form1_Load ( System :: Object ^ sender, System :: EventArgs ^ e ) <

timer1 — > Enabled = false ;
timer1 — > Interval = 1000 ; // 1 секунда
>
private : System :: Void button1_Click ( System :: Object ^ sender, System :: EventArgs ^ e ) <

time = System :: Convert :: ToInt32 ( textBox1 — > Text ) ;
timer1 — > Start ( ) ;

label1 — > Text = String :: Format ( «<0>» , time ) ;
>
private : System :: Void timer1_Tick ( System :: Object ^ sender, System :: EventArgs ^ e ) <

label1 — > Text = String :: Format ( «<0>» , time ) ;
>

else
<
timer1 — > Stop ( ) ;

label1 — > Text = «Время истекло» ;

Console :: Beep ( 1000 , 800 ) ; // Первый параметр задаёт частоту звука
// Второй параметр длительность (800 = 0.8 сек)

Простая анимация в C#

Создание анимации в C#

Цукерберг рекомендует:  Вакансии TRAVL – другой путеводитель.

В данном уроке используется среда программирования Microsoft Visual studio 2012. Алгоритм работы аналогичен и для других сред программирования.
Перед тем, как приступить к данному уроку, следует ознакомиться с предыдущим уроком : Как начать работать с графикой в Microsoft C#

Сначала создаем свой проект, в котором и будем работать. Разместим на форме (Form1) объекты : PictureBox, Timer и Button следующим образом:

Теперь попробуем создать какую-нибудь примитивную анимацию, при помощи PictureBox и Timer, которая запустится после нажатия на кнопку (Button).
Следовательно для этого будем обрабатывать событие нажатия на кнопку и событие «срабатывания» таймера. Также заведем все нужные для рисования объекты и переменные.
Далее приведен код программы и скриншоты, которые содержат все необходимое пояснение реализации анимации.

После этого, можно запустить программу и после нажатия на кнопку увидите простую анимацию – случайное перемещение кругов по черному фону, как показано ниже:

Для того, чтобы анимация соответствовала требованиям иногда необходимо менять так называемый тик таймера, т.е. промежуток выполнения очередного шага анимации. Это выполняется в Инспекторе объектов. Нужно выбрать элемент Timer, нажать на кнопку Свойства и там выбрать и изменить параметр Interval (выражается в миллисекундах) В данном примере Interval равен 150 мс.

Создать таймер на C#

Это расписание таймера: начало, интервал, параметр который он записывает в txt-вой файл и конец таймера. Работаю на console application в C#. Как сделать чтоб таймер работал так как показано на таблице.

1 ответ 1

Я что-то не понял, что это за интервал такой. Начало + интервал, явно не сходятся с концом, но, в целом, для алгоритма это и не важно. Вам нужно сделать следующее:

  • Заводите таймер-диспетчер, который будет срабатывать, скажем, каждую секунду.
  • Читаете Вашу таблицу и составляете список таймеров: когда начать, на сколько ставить, и что делать по завершении.
  • В событии timeout таймера диспетчера пробегаетесь по списку, и проверяете не пора ли нам начать какой-то таймер. Если пора, то удаляем данные из списка и создаём таймер, по timeout событии которого, мы будем писать наш текст в файл.
  • Повторяем эти шаги, пока наш список не закончится, после чего можно завершать программу.

Шпаргалка по C# и .NET Framework

В этой статье мы хотим вам предложить шпаргалку для языка C# и .NET Framework в которой собраны основные проблемы и их решение для начинающего программиста.

Оглавление:

Типы данных C#

Краткое имя

.Класс .NET

Тип

Width

Диапазон (бит)

Целое число без знака

Целое число со знаком

Целое число со знаком

От -2 147 483 648 до 2 147 483 647

Целое число без знака

От 0 до 4 294 967 295

Целое число со знаком

От -32 768 до 32 767

Целое число без знака

Целое число со знаком

От -922 337 203 685 477 508 до 922 337 203 685 477 507

Целое число без знака

От 0 до 18 446 744 073 709 551 615

Число одинарной точности с плавающей запятой

От -3,402 823e38 до 3,402 823e38

Число двойной точности с плавающей запятой

От -1,797 693 134 862 32e308 до 1,797 693 134 862 32e308

Одиночный знак Юникода

Знаки Юникода в тексте

Базовый тип для всех остальных типов

Точный дробный или целочисленный, который может представлять десятичные числа с 29 значащими цифрами.

От ±1,0 Ч 10e−28 до ±7,9 Ч 10e28

Массивы

Объявление одномерного массива:

Чтение в массив

Скопировать элементы массива m2 в m1

Перевод в систему счисления

Работа со строками

скопировать строку s2 в строку s1

Разделить строку string на массив подстрок

Бегущая строка windows forms

Быстрое создание массива строк при помощи метода Split

Windows forms

Основное:

Назначение события на клавишу

Избавится от мерцания окна в windows form

Получить расширение экрана

Массив контролов (TextBox), объявление:

Получить доступ к конкретному текстбоксу можно по индексу

Получить доступ к контролу по имени

Пройтись по всем однотипным контролам

Меняем местами переменные не используя 3-ей

Округлить число к заданной точности

Очистить поля TextBox`ov

Попадание точки в фигуру

Добавить программу в автозапуск

Скопировать в буфер обмена


Запретить закрытие программы через «приложения»

Узнать координаты мышки

Работа с формой

Запрет на изменение размера окна

Передача данных из формы в форму

Убрать форму с экрана

Сделать pictureBox прозрачным

Ввести в ячейку браузера логин и пароль

Покрасить слово в richtextbox

Работа с ListBox

Записываем выбранный элемент в стринг

Запись стрингового массива в элементы листбокса

Изменить настройки settings

Работа с ListView

Работа с подстроками и заголовками

Проверка принадлежности точки многоугольнику

Выбрать элементы в сплошную ( как в диспетчере задач в вкладке процессы)

Работа с Графикой

Определение поля для рисования

Создание пера для рисования

Сдвиг точки на указанное расстояние и на указанный угол

Работа с кнопкой

Функция нажатия на кнопку(скопирована из стандартной)

Работа с таймером

Объявление и инициализация таймера

Функция тика таймера

DataGridView

Выключить стандартный столбец (тот что слева)

Выделять всю строку (как в диспетчере задач)

Позволение рисовать на датагриде

Узнать в какой форме расположен датагрид

Убрать стандартную пустую строчку в datagrid

Работа с файлами

Чтение из файла (требуется using System.IO;)

Создание и запись файла (требуется using System.IO;)

Получить имена директорий в заданной папке и записать их в массив

Проверяет, существует ли файл

Закрыть доступ к файлу

Работа с System.IO.Path

DataSet

Поменять расположение столбца

Считывание xml с файла и выборка данных в dataset

Основное

IP адрес локального ПК

Правильное заполнение Filter в OpenFileDialog

Перечислимый тип (enum)

Узнать раскладку клавиатуры и сменить её

Асинхронный вызов методов

Проверка содержится ли определенное значение в массиве

Создание своего класса Exception и использованием сериализации

Создание пользовательского атрибута

Печать элементов массива

Использование именованных параметров

Регулярное выражение для преобразования ссылок в html ссылки ( теги)

C# — Работа с таймером C# (WinForms)

static int n = 0; //�������.
static int n1 = 0; //�������.

Цукерберг рекомендует:  Выскальзывающее меню на CSS3

private void button5_Click(object sender, EventArgs e)
<

string command = comboBox1.Text;
System.Timers.Timer tmr = new System.Timers.Timer();
tmr.Elapsed += new ElapsedEventHandler(OnTimedEvent);
tmr.Interval = 5000; //������������� �������� � 1 ���.
tmr.Enabled = true; //������� ������.
while (n != 1) ; //������ ������ 4 ����.

if (command.Length > 0)
<
command = ConvertEscapeSequences(command);

CommPort com = CommPort.Instance;
com.Send(command);

if (Settings.Option.LocalEcho)
<
outputList_Add(command + «\n», sentColor);
>
>

System.Timers.Timer tmr1 = new System.Timers.Timer();
tmr1.Elapsed += new ElapsedEventHandler(OnTimedEvent1);
tmr1.Interval = 10000; //������������� �������� � 1 ���.
tmr1.Enabled = true; //������� ������.
while (n1 != 1) ; //������ ������ 4 ����.

comboBox1.Text = «a»;
comboBox1.Items.Add(comboBox1.Text);
comboBox1.Focus();

if (command.Length > 0)
<
command = ConvertEscapeSequences(command);

CommPort com = CommPort.Instance;
com.Send(command);

if (Settings.Option.LocalEcho)
<
outputList_Add(command + «\n», sentColor);
>
>

>
public static void OnTimedEvent(object source, ElapsedEventArgs e)
<
n++;

>
public static void OnTimedEvent1(object source, ElapsedEventArgs e)
<

Как добавить таймер в консольное приложение C #

Только это — как добавить таймер в консольное приложение C #? Было бы здорово, если бы вы могли привести пример кода.

7 ответов

Это очень хорошо, однако, чтобы смоделировать некоторое время, нам нужно запустить команду, которая занимает некоторое время, и это очень ясно во втором примере.

Однако стиль использования цикла for для выполнения некоторой функциональности навсегда требует много ресурсов устройства, и вместо этого мы можем использовать сборщик мусора, чтобы сделать что-то подобное.

Мы видим эту модификацию в коде из той же книги CLR Via C # Third Ed.

Используйте класс System.Threading.Timer.

System.Windows.Forms.Timer предназначен главным образом для использования в одном потоке, обычно в потоке пользовательского интерфейса Windows Forms.

Существует также класс System.Timers, добавленный на ранних этапах разработки .NET Framework. Однако обычно рекомендуется вместо этого использовать класс System.Threading.Timer, так как в любом случае это всего лишь оболочка для System.Threading.Timer.


Также рекомендуется всегда использовать статический (совместно используемый в VB.NET) System.Threading.Timer, если вы разрабатываете службу Windows и вам требуется периодически запускать таймер. Это позволит избежать преждевременной сборки мусора вашего объекта таймера.

Вот пример таймера в консольном приложении:

Из книги CLR Via C # Джеффа Рихтера. Кстати, эта книга описывает обоснование трех типов таймеров в главе 23, настоятельно рекомендуется.

Вот код для создания простого таймера на одну секунду:

А вот и результат:

РЕДАКТИРОВАТЬ . Не рекомендуется добавлять в код циклы жесткого вращения, поскольку они потребляют циклы ЦП без какой-либо выгоды. В этом случае этот цикл был добавлен только для того, чтобы остановить закрытие приложения, позволяя наблюдать за действиями потока. Но для правильности и уменьшения загрузки процессора в этот цикл был добавлен простой вызов Sleep.

Таймеры

В .NET Framework доступно несколько классов Timer, которые могут применяться для обеспечения вызова методов по истечении определенного промежутка времени. Ниже перечислены все эти классы, указаны пространства имен, к которым они относятся, и кратко описаны функциональные возможности, которыми они обладают:

Пространство имен Описание
System.Threading Класс Timer из пространства имен System.Threading предлагает ключевую функциональность. В его конструкторе можно передавать делегат, который должен вызываться через указываемый интервал времени.
System.Timers Класс Timer из пространства имен System.Timers является компонентом, потому что унаследован от базового класса Component. Благодаря этому, его можно перетаскивать из окна Toolbox (Панель инструментов) в область проектирования серверного приложения, например, Windows-службы. Этот класс Timer использует класс System.Threading.Timer, но вместо делегатов предоставляет механизм на основе событий.
System.Windows.Forms В случае использования классов Timer из пространства имен System.Threading и System.Timers методы обратного вызова или событий инициируются не из вызывающего, а из другого потока. Элементы управления Windows Forms привязываются к потоку создателя. Обратный вызов в этот поток как раз и позволяет осуществлять класс Timer из пространства имен System.Windows.Forms.
System.Web.UI Класс Timer из пространства имен System.Web.UI является расширением Ajax и предназначен для использования с веб-страницами.
System.Windows.Threading Класс DispatcherTimer из пространства имен System.Windows.Threading применяется в WPF-приложениях и выполняется в рамках потока пользовательского интерфейса.

В случае применения класса System.Threading.Timer подлежащий вызову метод может передаваться прямо в первом параметре конструктора. Этот метод должен обязательно удовлетворять требованиям делегата TimerCallback, согласно которым возвращаемым типом должен быть void, а типом параметра — object. Во втором параметре может передаваться любой объект, который затем будет получен с аргументом объекта в методе обратного вызова.

Например, это может быть объект Event, который будет отправлять вызывающему классу соответствующий сигнал. В качестве третьего параметра указывается промежуток времени, через который метод обратного вызова должен вызываться в первый раз, а в качестве четвертого и последнего — промежуток времени, через который метод обратного вызова должен вызываться повторно. Если необходимо, чтобы таймер сработал только один раз, в четвертом параметре должно быть указано значение -1. Для изменения промежутка времени после создания объекта Timer служит метод Change().

Для целей иллюстрации предположим, что имеется консольное приложение, которое выводит текущее время каждую секунду до тех пор, пока пользователь не нажмет клавишу для прекращения приложения:

Спрайтовая анимация

Цель примера — показать способ рисования спрайтов в динамике. Спрайт (англ. Sprite — фея; эльф) — графический объект в компьютерной графике, чаще всего — растровое изображение, которое можно отобразить на экране.

Предварительные действия. Создадим в Paint три изображения на белом фоне, каждый размером 100х100 пикселей. Нарисуем (без рамок) в первом квадрате красный круг, во втором — зеленый, третий квадрат оставим белым. Сохраним их в формате JPEG, присвоив имена файлов spr1.jpg, spr2.jpg, spr3.jpg соответственно.

Будем изображать перемещение шара по некоторой траектории (например, по прямой) на холсте графического объекта pictureBox1, который мы поместим на форму. Часто бывает удобно использовать такого рода контейнеры вместо непосредственного рисования на форме. Для хранения трех спрайтов будем использовать невизуальный компонент ImageList1 (список изображений), для управления анимацией будем использовать компонент timer1. Создадим приложение Windows Form и зададим имя namespace = Sprite.

На вкладке Form1.cs (Конструктор) мы видим pictureBox1 (в пунктирной рамке), а также невизуальные компоненты timer1 и ImageList1. Пусть pictureBox1 занимает не все окно формы. В коллекцию изображений (свойство imageList1.Images) добавим через окно Свойства наши три рисунка с индексами 0,1,2. Для таймера свойству timer1.Interval присвоим 100. Это будет означать, что изменение положения спрайта-шарика будет происходить примерно 14 раз в секунду. Создадим заготовку обработчика события timer1.Tick — метод :
private void timer1_Tick(object sender, EventArgs e)
Тогда первоначальный код проекта (Form1.cs) будет выглядеть так:

Цукерберг рекомендует:  Конкурс - Работа в команде,свой проект.

Примечание. Отметим, что при генерации шаблона Windows-приложения добавляются в раздел using библиотеки, которые нам будут не нужны. Нажав в окне редактора кода Form1.cs правую кнопку, выберем из меню позицию «Управление директивами using», а в ней выберем «Удалить неиспользуемые директивы using», после чего ненужные нам директивы будут удалены.

У нас все готово для программирования спрайтов. В описание класса Form1 перед конструктором Form1() введем описание двух объектов:
Graphics g; // графический объект — некий холст
Bitmap buf; // буфер для Bitmap-изображения
и трех переменных класса:
int stage = 0; // индекс чередующегося шара (красный — 0, зеленый — 1, белый — 2)
int x = 0, y = 0; // координаты шара (левого верхнего угла квадрата)
В конструктор Form1() добавим следующие операторы:

Первый изменяет цвет формы на синий, четыре следующих оператора готовят холст для рисования на pictureBox1, последний запускает в работу таймер (в конструкторе первоначально timer1.Enable=false). Переменные g и buf, объявленные в классе, в конструкторе Form1 конкретизируются: buf получает ссылку на pictureBox1, а g получает ссылку на новый графический объект. Теперь рисование спрайта-шара будет выполняться именно на поверхности pictureBox1. Координаты окна: (0,0) — (pictureBox1.Width, pictureBox1.Height) — левый верхний и правый нижний углы.

Рисование шара-спрайта реализуется в методе timer1_Tick( ) с использованием переменной stage и метода Draw(g, Point(x, y), stage) объекта imageList1.

На холсте — зеленый шар!

Если закомментировать оператор (показать шар), то никаких изображений мы не увидим. Оно, конечно, формируется в паре объектов «g–buf» и в любой момент может появиться на холсте через вызов этого оператора. Последний оператор после прохождения шаром диагонали возвращает его в начальную позицию для продолжения. Поэкспериментируйте!

Programming stuff

Страницы

вторник, 17 марта 2009 г.

Многопоточность в Windows Forms. Control.Invoke().

public partial class Form1 : Form

//на форме расположен 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 )

textBox1 . Text = tickCount . ToString ();

private readonly System . Threading . Timer timer ;

private int tickCount ;

private void AsyncHandler ( object data )

Action int > action = DoChangeTicks ;

Invoke ( action , tickCount );

private void DoChangeTicks ( int count )

textBox1 . Text = tickCount . ToString ();

private void AsyncHandler ( object data )

Action action = () => textBox1 . Text = tickCount . ToString ();

/// Расширения облегчающие работу с элементами управления в многопоточной среде.

public static class ControlExtentions

/// Вызов делегата через control.Invoke, если это необходимо.

Делегат с некоторым действием

public static void InvokeIfNeeded ( this Control control , Action doit )

if ( control . InvokeRequired )

control . Invoke ( doit );

/// Вызов делегата через control.Invoke, если это необходимо.

/// Тип параметра делегата

Делегат с некоторым действием

Аргумент делагата с действием

public static void InvokeIfNeeded T >( this Control control , Action T > doit , T arg )

if ( control . InvokeRequired )

control . Invoke ( doit , arg );

private void AsyncHandler ( object data )

() => textBox1 . Text = tickCount . ToString ()

10 комментариев:

Прикольно! Блин, как много нужно прочитать.

Хорошей альтернативой которую можна использовать не только в Windows Forms а всюда где надо маршалить вызовы между потоками будет SynchronizationContext .

Конечно, согласен. Но, как и во многих других вопросах, специализированные решения оказываются более простые в рамках одной задачи.
Здесь тоже самое. Способ, описанный выше — один из самых удобных способов работы с многопоточностью в Windows Forms, но при этом он не универсален.
Хотя знание общих подходов и принципов также весьма полезно.

Боюсь, что для того чтобы использовать SynchronizationContext в других сферах кроме WinForms и WPF придется изрядно попотеть, т.к. сам по себе класс SynchronizationContext не предоставляет нужную функциональность для маршалинга вызовов в определенный поток. В случае Send() он использует ThreadPool.QueueUserWorkItem, а в случае Post() вызывает метод в том же потоке. Поэтому если хочется иметь возможность делать маршалинг вызова в определенный поток, то придется этот механизм реализовывать вручную. В .net есть только 2 готовых реализации — для WinForms (WindowsFormsSynchronizationContext) и для WPF (DispatcherSynchronizationContext). Кстати, WindowsFormsSynchronizationContext реализован именно через механизм Control.BeginInvoke.

Как вариант, мне больше нравится:
this.Invoke(new EventHandler(delegate
<
textBox1.Text = tickCount.ToString()
>));
Подсмотрено на http://www.codeproject.com/KB/threads/ThreadingDotNet2.aspx

Из плюсов нет необходимости в дополнительных классах а логика программы так-же прозрачна

Ну, твой код ничем не отличается от приведенного:
Action action = () => textBox1.Text = tickCount.ToString();
if (InvokeRequired)
<
Invoke(action);
>
else
<
action();
>
Только используется синтаксис анонимных делегатов из C# 2.0, а этот вариант использует синтаксис C# 3.0.
Причем, если рассмотреть приведенный мною вариант без проверки на InvokeRequired, то код будет таким:

Action action = () => textBox1.Text = tickCount.ToString();
textBox.Invoke(action);

Что, как по мне, короче, понятнее и красивее:)

2Денис: чем тебе не нравится новый синтаксис анонимных делегатов в C#3.0?

«чем тебе не нравится новый синтаксис анонимных делегатов в C#3.0?»

Тем, что это синтаксис 3.0 ! FrameWork 3.0 не поддерживается на Windows 2000, поэтому приходится писать на FrameWork 2.0

2Drakosha: а откуда Вы знаете под какую винду Денис пишет код?
Я же не говорил абстрактно, я задавал вопрос конкретному человеку, который, насколько я помню пишет именно под .net 3.5 :)

У меня вопрос. Уже во втором посте я вижу, что вы пытаетесь заменить отдельные функции лямбдами. Я же читал (честно — не помню где), что более «православно» разделять функционал на как можно более мелкие функции и стремиться к тому, чтобы код фукции влазил на один экран. Лично мне тоже проще понять, что происходит в фукции, если она маленькая.

Учитывая это, могли бы вы объяснить свой подход?
Спасибо.

Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих