Использование словаря <ThreadingTimer, Label> в c # - PullRequest
0 голосов
/ 08 октября 2011

Как использовать словарь в ThreadingTimer? Я хочу использовать таймер, который показывает количество обновлений строк в 2 секунды, а также отображается в метке в форме Windows. Вот мой код,

ThreadingTimer timer;

private Dictionary<ThreadingTimer, Label> dict = new Dictionary<ThreadingTimer, Label>();

private void button1_Click(object sender, EventArgs e) {
   string myconstring = "SERVER=localhost;" + "DATABASE=alicosms;" + "UID=root;" + "PASSWORD=;";
   MySqlConnection mycon = new MySqlConnection(myconstring);
   string sql = "SELECT flag FROM sms_data_bankasia WHERE flag>=100 AND flag<=109 group by flag";
   MySqlCommand comd = mycon.CreateCommand();
   comd.CommandText = sql;
   mycon.Open();
   MySqlDataReader dtr = comd.ExecuteReader();

   int i = 0;
   while (dtr.Read()) {
      dataValues.Add(dtr.GetInt32(0));

      i++;

      label = new Label();
      label.Name = "label_name" + i;
      label.Size = new Size(60, 20);
      label.Location = new Point(45, 100 + i * 30);
      label.TabIndex = i;
      label.Visible = true;
      this.Controls.Add(label);
   }

   dtr.Close();                                  
}

void PrepareTimers(List<int> _dataValues) {
   foreach (int dataValue in _dataValues) {
      ThreadingTimer timer = new ThreadingTimer(new TimerCallback(TimerAction), dataValue, 0, 2000);
      dict[timer] = label;
   }
}

void TimerAction(object flag) {
   mycon.Open();

   string sql = "SELECT count(flag) FROM sms_data_bankasia where sendingstatus='UPDATED' AND flag = " + (flag.ToString())  + " *2 group by flag";
   MySqlCommand comd = mycon.CreateCommand();
   comd.CommandText = sql;

   MySqlDataReader dtr = comd.ExecuteReader();

   try {
      while (dtr.Read()) {
         ThreadingTimer t = (ThreadingTimer)flag;
         dict[t].Text = dtr[0].ToString() + " program Updated";
      }
   } catch (Exception ex) {
      MessageBox.Show(ex.Message);
   }

   mycon.Close();
}

Этовыдает ошибку «Невозможно привести объект типа« System.Int32 »к типу« System.Threading.Timer »».Что мне делать? Кто-нибудь может мне помочь, пожалуйста?

1 Ответ

1 голос
/ 08 октября 2011

Линия

foreach (int dataValue in _dataValues)
{
    ThreadingTimer timer = new ThreadingTimer(new TimerCallback(TimerAction), dataValue, 0, 2000);
    // dataValue is an int
}

принимает dataValue в качестве состояния. Государство предоставляется как ваш флаг. Так что в

void TimerAction(object flag)

приведение от объекта к таймеру недопустимо.

ThreadingTimer t = (ThreadingTimer)flag; // flag is an int

Вы не можете использовать таймер в качестве состояния таймера. Может быть, использовать int в качестве ключа для вашего словаря?

Обновление:

Вместо объявления

private Dictionary<ThreadingTimer, Label> dict = new Dictionary<ThreadingTimer, Label>();

Вы можете объявить

private Dictionary<int, Label> dict = new Dictionary<int, Label>();

вместо

dict[timer] = label;

вы делаете

dict[dataValue] = label;

так что вы можете сделать

int t = (int)flag;
dict[t].Text = dtr[0].ToString() + " program Updated";

Непроверено!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...