C#, Timer, BackgroundWorker

программирование C#

сделал программульку, она каждые 20мс выполняет некоторое простое действие. работает хорошо проблема в том, что во время выполнения, после запуска таймера, виснет форма. что-то мне подсказывает, что можно использовать BackgroundWorker, чтобы запихать все это в отдельный поток, но не пойму как. на мсдн рассматривается ситуация с объемными вычислениями, а не большим количеством вызовов одной мелкой функции. подскажите, что можно сделать.

Примечание:
не уверен насчет версии .NET, диспетчер программ говорит, что установлен 4й, но я не профи в плане, что для какой версии делать. у меня микрософт экспресс 2010.

public partial class Form1 : Form
{
public int cc;

public Form1()
{
InitializeComponent();
}

private void checkBox2_CheckedChanged(object sender, EventArgs e)
{
cc = 0;
timer1.Enabled = checkBox2.Checked;
}

private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
timer1.Interval = Convert.ToDouble(numericUpDown1.Value);
if (cc < (dataGridView1.Rows.Count-1))
{ cc++; }
else
{ cc = 1; }

SendKeys.Send(dataGridView1.Rows[cc-1].Cells[0].Value.ToString());
}
}


таймер использую System.Timers.Timer
оно в общем работает, но виснет форма и не получается выключить таймер, так как не жмутся кнопки.

Примечание:
Crimsonlander, что-то не получается. ну то есть, все работает, а остановить не могу

public partial class Form1 : Form
{
Thread thread;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
thread = new Thread(DoWork);
thread.Start();
}
private void button2_Click(object sender, EventArgs e)
{
thread.Abort();
}
public void DoWork()
{
int cc = 0;
while (true)
{
if (cc < (dataGridView1.Rows.Count - 1))
{ cc++; }
else
{ cc = 1; }
SendKeys.SendWait(dataGridView1.Rows[cc - 1].Cells[0].Value.ToString());
Thread.Sleep(20);
}
}
}

Примечание:
кажется, я понял, в чем проблема. ведь вся эта штука очень быстро спамит эмуляцией нажатия клавиш в активное приложение. и видимо, когда я нажимаю кнопку, сначала делается активным форма, соответственно, поток спама перешибает все мышиные клики, или что-то вроде.
Ответы:
Какая целевая версия .NET? Покажите то, как Вы делаете сейчас.
Класс BackgroundWorker нужен для того, чтобы выполняя работу в одном потоке следить за прогрессом из другого, вам он не нужен. В вашем случае нужно просто создать еще 1 поток (класс Thread), и делать все в нем.
Таймер тут мало подходит, хотя есть и некрасивый вариант с таймером - при нажатии флажка создавать другую форму и на ней таймер, при снятии флажка убивать форму.


12 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.