Линия
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";
Непроверено!