решение потока выглядит так:
public class WebserviceChecker {
private int durationInHours = 1;
public void setDuration(int value) { durationInHours = value; }
private boolean _shutdown = false;
private DateTime _startTime = null;
// System.Windows.Forms.Timer
private Timer _timer = null;
public void CheckWebservice() {
_startTime = DateTime.Now;
_timer = new Timer();
_timer.Tick += handleTimerTick;
while(!_shutdown) {
try {
// do what ever you want to do for checking your webservice...
// ...
} catch (ThreadAbortedException ex) {
// do cleanup, then
//
break;
} catch (Exception ex) {
Logger.Instance.log(LoggerLogType.Type.Err, ex.ToString());
}
// wait 5 secs (customize to your needs)
Threading.Thread.Sleep(5000);
}
if(_shutdown) {
// do some regular cleanup here...
}
} // public void CheckWebservice()
public void Shutdown() {
_shutdown = true;
}
private void handleTimerTick(Object sender, System.EventArgs e) {
TimeSpan ts = _startTime .Subtract(DateTime.Now);
if(ts.TotalHours >= durationInHours) {
Shutdown();
}
}
}
а теперь запустите фоновый поток следующим образом:
WebserviceChecker _c = new WebserviceChecker();
Thread _watcher = new Thread(_c.CheckWebservice);
_watcher.IsBackground = true;
_watcher.Start();
для запланированной задачи посмотрите здесь: C# запустить запланированную задачу
я бы предпочел решение с потоком, потому что получение данных из внешнего процесса немного сложнее. синхронизация данных потока с вашим основным потоком проще. вам потребуются такие парадигмы, как IPC (межпроцессное взаимодействие) поверх WCF по именованным каналам или через сокеты ( TCP/UDP).
если вам нужна подсказка, как вернуть данные из вашего потока: вы могли бы, например. определите событие в классе WebserviceChecker, которое вы вызовете при изменении состояния вашего WS.
несколько слов о IsBackground... если вы НЕ переводите поток в фоновый режим, ваше приложение завершится только тогда, когда каждый поток переднего плана выйдет из своего рабочего метода. Фоновые потоки будут автоматически прерваны при закрытии приложения.
слово для ThreadAbortedException: в .NET мы получаем привилегию принудительно прерывать поток. фреймворк вызовет это исключение в любой позиции метода потока, чтобы выйти из него. если вы его не поймаете, поток завершится без очистки. так что просто поймайте его и очистите память или выполните некоторые завершающие задачи. вы бы сделали это вот так:
_watcher.Abort();
ура сет :)
[править] в MSDN есть хороший учебник по многопоточности: http://msdn.microsoft.com/en-us/library/aa645740%28v=vs.71%29.aspx [/edit]
[править] если вы хотите использовать System.Threading.Timer, вам необходимо внедрить делегат System.Threading.TimerCallback в свой класс наблюдателя. то вы можете создать новый таймер с периодом вместо фонового потока. см. http://msdn.microsoft.com/de-de/library/system.threading.timercallback.aspx подробнее [/edit]
person
ceth
schedule
08.03.2013