solusi utas terlihat seperti ini:
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();
}
}
}
dan sekarang mulai thread latar belakang seperti ini:
WebserviceChecker _c = new WebserviceChecker();
Thread _watcher = new Thread(_c.CheckWebservice);
_watcher.IsBackground = true;
_watcher.Start();
untuk tugas terjadwal lihat di sini: C# memulai tugas terjadwal
saya lebih suka solusi thread karena mendapatkan data dari proses eksternal sedikit lebih rumit. menyinkronkan data thread ke thread utama Anda lebih mudah. Anda memerlukan paradigma seperti IPC (Inter Process Communication) melalui WCF dengan nama pipa atau komunikasi soket ( TCP/UDP).
jika Anda memerlukan petunjuk cara mendapatkan kembali data dari utas Anda: Anda bisa, misalnya. tentukan acara di kelas WebserviceChecker yang akan Anda naikkan ketika ada perubahan status WS Anda.
beberapa kata tentang IsBackground... jika Anda TIDAK menyetel thread ke latar belakang, aplikasi Anda hanya akan keluar, ketika setiap thread latar depan telah keluar dari metode pekerjanya. Thread Latar Belakang akan dibatalkan secara otomatis, ketika aplikasi dimatikan.
satu kata untuk ThreadAbortedException: di .NET kita mendapatkan hak istimewa untuk membatalkan thread dengan keras. kerangka kerja akan memunculkan pengecualian ini di posisi mana pun dalam metode thread untuk keluar darinya. jika Anda tidak menangkapnya, thread akan keluar tanpa pembersihan. jadi tangkap saja, dan bersihkan memori atau lakukan beberapa tugas penyelesaian. Anda akan melakukan ini di sini seperti itu:
_watcher.Abort();
bersorak ceth :)
[sunting] ada tutorial multi threading yang bagus di MSDN: http://msdn.microsoft.com/en-us/library/aa645740%28v=vs.71%29.aspx [/edit]
[edit] jika Anda ingin menggunakan System.Threading.Timer Anda perlu mengimplementasikan delegasi System.Threading.TimerCallback ke kelas pengamat Anda. lalu Anda dapat membuat instance pengatur waktu baru dengan titik, bukan thread latar belakang. lihat http://msdn.microsoft.com/de-de/library/system.threading.timercallback.aspx untuk detail lebih lanjut [/edit]
person
ceth
schedule
08.03.2013