2013-09-23 5 views
1

Я пытаюсь запустить таймер в текстовом поле, и мне не повезло.C# показать таймер в текстовом поле

Это код, я использую:

private static System.Timers.Timer timer; 
... 
private void StartBtn_Click(object sender, EventArgs e) 
{ 
    timer = new System.Timers.Timer(1000); 
    timer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
    timer.Enabled = true; 
} 
... 
private void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    TimeTb.Text = e.SignalTime.ToString(); 
} 

Но ничего не происходит.

Я попытался это:

private void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    MessageBox.Show(e.SignalTime.ToString(), 
    "Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question); 
} 

И это работало нормально. Кто-нибудь знает, почему он не работает с моим текстовым полем?

+0

У вас должен быть еще один длительный процесс, который фактически работает в потоке пользовательского интерфейса. Этот код будет работать. –

+0

Какой из них вы использовали окна или веб-приложение? –

+0

@RameshRajendran, для работы с MessageBox это должно быть приложение Windows. –

ответ

4

Истекшее событие запускается в другой теме, затем в пользовательском интерфейсе. Его нельзя разрешать манипулировать объектами пользовательского интерфейса из другого потока, а исключение должно появляться в вашем EventHandler. Поскольку вы не используете Исключения, вы не заметите этого.

В StartBtn_Click установить SynchronizingObject Собственность Таймера на это (форма). Затем прошедшее событие будет синхронизировано с основным потоком.

1

Может быть, вы должны сначала запустить таймер.

Взгляните:

http://msdn.microsoft.com/en-us/library/system.timers.timer.start.aspx

Так добавить:

timer.Start(); 
+1

Я думал, что 'timer.Enabled = true;' сделал это: O –

+0

@Litari, нет, 'Start' должен быть вызван. –

+0

Я попытался запустить его, но это не имело значения:/ –

0

вы могли бы сделать что-то вроде

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     this._timer = new DispatcherTimer(); 
     this._timer.Interval = TimeSpan.FromMilliseconds(1); 
     this._timer.Tick += new EventHandler(_timer_Tick); 
     _timer.Start(); 
    } 

void _timer_Tick(object sender, EventArgs e) 
{ 
    t= t.Add(TimeSpan.FromMilliseconds(1)); 
    textBox.Text = t.Hours + ":" + t.Minutes + ":" + t.Seconds + ":" + t.Milliseconds; 
} 

Edit:

Как добавить ассамблею: WindowsBase

enter image description here

+0

Что мне нужно включить, чтобы иметь возможность использовать DispatcherTimer? 'using System.Windows.Threading', похоже, не существует. –

+0

Использование Сборка: WindowsBase –

0

Может быть, с помощью Application.DoEvents(); после TimeTb.Text = e.SignalTime.ToString(); будет работать, хотя использовать его не рекомендуется (Use of Application.DoEvents()).

1

Поместите try catch вокруг OnTimedEvent и проверьте, есть ли проблемы с поточной обработкой. Если есть, попробуйте использовать System.Windows.Forms.Timer, который может решить проблемы поперечной резьбы.

http://msdn.microsoft.com/en-us/library/system.windows.forms.timer.aspx

Как сказано:

Реализует таймер, который генерирует событие в определенные пользователем интервалы времени. Этот таймер оптимизирован для использования в приложениях Windows Forms и должен использовать в окне.

1

Ваш обратный вызов OnTimedEvent не будет вызываться в потоке пользовательского интерфейса, поэтому вы получите исключение, пытаясь установить текст текстового поля. Поэтому вам необходимо изменить обработчик событий, чтобы он выглядел так:

private void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    if (TimeTb.InvokeRequired) 
    { 
    TimeTb.Invoke((MethodInvoker)delegate 
       { 
        OnTimedEvent(source, e); 
       }); 

    } 

    TimeTb.Text = e.SignalTime.ToString(); 
} 
Смежные вопросы