Ваша проблема, кажется, решаема с Threading .
В WPF вы можете сделать:
Thread t = new Thread((ThreadStart)delegate() {
while (true) {
Thread.sleep(500);
if (c.hasChanged())
Dispatcher.Invoke((Action)delegate() {updateData();});
}
}).Start();
В WinForms
Thread t = new Thread((ThreadStart)delegate() {
while (true) {
Thread.sleep(500);
// this must derive from Control
if (c.hasChanged())
this.Invoke((Action)delegate() {updateData();});
}
}).Start();
Возможно, отсутствуют параметры для Invoke (который необходим для выполнения кода в вызывающем потоке пользовательского интерфейса), но я пишу это из своего мозга, так что нет смысла в наличии: D
В .NET 4 вы можете использовать TaskFactory.StartNew вместо того, чтобы создавать поток самостоятельно.
В .Net <= 4 вы можете использовать <a href="http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx" rel="nofollow"> TreadPool для потока.
Однако я напоминаю, что вам нужно, чтобы это было выполнено сразу, потому что вы ожидаете, что оно будет проверяться как можно скорее, и пул потоков не убедит вас в этом (он может быть уже заполнен, но не очень вероятно :-).
Только не делайте глупостей, таких как порождение большего количества из них в цикле!
А внутри потока вы должны поставить чек, как
while (!Closing)
чтобы поток мог закончиться, когда вам это нужно, без необходимости прибегать к плохим вещам, таким как t.Abort();
При выходе установите Closing в true и выполните t.Join()
, чтобы закрыть поток проверки.
EDIT:
Я забыл сказать, что Closing должен быть свойством bool или логическим значением VOLATILE , а не простым логическим, потому что вы не будете уверены, что поток может когда-либо завершиться (что ж, в случае Вы закрываете приложение, но это хорошая практика, чтобы заставить их закончить по вашей воле). ключевое слово volatile предназначено для предотвращения применения (псевдо) компилятором любых оптимизаций к коду, которые предполагают, что значения переменных не могут изменяться