c# - Timer runs in different thread than the one that created it -
using visual studio 2015, visual c# windows application.
i need timer empties queue in main thread because ui components modified. coded this:
public form1() { initializecomponent(); q = new concurrentqueue<amsg>(); timer = new system.timers.timer(100); timer.elapsed += timer_elapsed; timer.enabled = true; } void timer_elapsed(object sender, system.timers.elapsedeventargs e) { clsudpmsg msg; while (q.trydequeue(out msg)) handlerx(msg); } but elapsed event executes in worker thread...?
if put timer on main form @ design time generated prototype different:
private void timer1_tick(object sender, eventargs e) { amsg msg; while (q.trydequeue(out msg)) handlerx(msg); } but 1 execute in main thread context.
the question extends thread creates timer way; thought timer created in thread executes elapsed event in same thread context. missing something?
quick edit: see these different timers, system.timers.timer , windows.forms.timer. - how reliably create timers execute in thread create them?
yeah, you're dealing 2 separate timer classes. system.windows.forms.timer fires tick event on main thread , system.timers.timer fires elapsed event on background thread. advantage of system.windows.forms.timer hides threading; advantage of system.timers.timer doesn't require message pump work.
you ask, "how reliably create timers execute in thread create them?" well, easy when have windows forms gui , starting timer on ui thread: use system.windows.forms.timer. if don't have message pump take advantage of, have use system.timers.timer , way run on main thread when timer fires elapsed event recreate message loop in main thread--have sit, maybe waiting monitor.pulse or other kind of notification timer thread. means main thread won't getting useful done in meantime...
Comments
Post a Comment