I am develping an app which load some url, parse them, keep them into sqlite db and the UI will read the saved data and show them in controls. This progress should be done in almost an infinit loop. For having fast response i plan to read the data from db in main thread and have an other thread (background worker) to load the data and insert it into db. Is it logical and possible to run read and write process in dispatchertimer, one timer in main thread and the other inside the background worker? and how? Or does anyone have better idea?
main thread:
DispatcherTimer _Timer1 = new DispatcherTimer();
_Timer1.Interval = _Interval;
_Timer1.Tick += _Timer1_Tick;
void _Timer1_Tick(object sender, EventArgs e)
{
// read data from db and show in controls
}
secondary thread:
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
DispatcherTimer _Timer2 = new DispatcherTimer();
_Timer2.Interval = _Interval;
_Timer2.Tick += _Timer2_Tick;
}
void _Timer2_Tick(object sender, EventArgs e)
{
// write data into db
}
}
What you’re planning to do wont work.
Both your
_Timer1_Tickand_Timer2_Tickwill run in the UI thread. If you perform some long-running operations there, it’ll hang the UI.I don’t get it, why do you need timers at all? Using timers for anything else but measuring time intervals is rarely a good strategy. You could e.g. run your update process in the infinite loop in background, as soon as it put new data in the DB you call
Dispatcher.BeginInvoke(passing any data you want) to notify your UI thread it should update itself with the newly available data.And by the way, for the tasks like “send HTTP request, wait response, parse, store, repeat”, the new async/await feature is a natural choice. For WP7 the functionality is available as “Async CTP” redistributable package for Visual Studio 2010, for WP8 it’s already integrated into the framework. There’re some compatibility issues between the 2, though.