Cara menjalankan tugas atau utas C# untuk waktu X

Saya memiliki logika bisnis untuk memeriksa layanan web apakah layanan itu hidup atau tidak.

Saya ingin memeriksanya berulang kali setiap 5 menit selama 1 jam setelah waktu mulai.

Cara melakukan ini melalui tugas atau utas atau fungsi menunggu/async.


person Abhishek Gupta    schedule 08.03.2013    source sumber
comment
Apa yang sudah Anda coba?   -  person Mario S    schedule 08.03.2013
comment
Judul Anda membingungkan... Saya kira Anda ingin panggilan berulang setiap X menit... Lihat pertanyaan serupa - stackoverflow.com/questions/tagged/   -  person Alexei Levenkov    schedule 08.03.2013
comment
@Alexei Saya sebenarnya tidak ingin melakukan apa yang Anda pikirkan. Saya ingin menjalankan tugas untuk jangka waktu X   -  person Abhishek Gupta    schedule 08.03.2013
comment
@ mario sampai sekarang saya baru saja memecat tugas yang berjalan tanpa batas hingga layanan windows saya berjalan, tetapi saya ingin memecat tugas itu untuk katakanlah 10 menit berikutnya setelah 10 menit saya harus memecat tugas baru dan ingin membuang yang sebelumnya   -  person Abhishek Gupta    schedule 08.03.2013
comment
Judul masih belum jelas bagi saya, tapi setidaknya saya melihat kebutuhan Anda... Saya kira Anda akan kesulitan menemukan solusi - jika Anda tidak ingin menjalankan tanpa batas/terus-menerus memeriksa kedaluwarsa dan tidak ingin pengatur waktu, itu sulit untuk melakukan sesuatu setelah jangka waktu berapa pun...   -  person Alexei Levenkov    schedule 08.03.2013


Jawaban (2)


Pertama, periksa kembali kebutuhan bisnis Anda. Apa sebenarnya manfaatnya bagi Anda? Layanan web mungkin tiba-tiba hilang kapan saja, jadi fakta bahwa Anda baru saja memeriksanya tidak berarti panggilan Anda berikutnya akan berhasil. Hal ini berlaku untuk semua komunikasi jaringan.

Jadi kompleksitas kode "asli" Anda tidak berkurang jika Anda memiliki "pemeriksa" terpisah. Satu-satunya keuntungan dari desain semacam ini adalah semacam pemberitahuan visual kepada pengguna bahwa mereka cukup yakin bahwa panggilan berikutnya ke layanan akan berhasil. Meski begitu, Anda mungkin ingin mempertimbangkannya kembali, karena hal ini cukup pasti, dan pengguna akan marah jika Anda berbohong kepada mereka.

Meskipun demikian, Anda dapat melakukannya menggunakan Tasks seperti ini:

private static async Task CheckAsync(CancellationToken token)
{
  // Check your web service.
  await CheckWebServiceAsync(token);

  // Wait 5 minutes.
  await Task.Delay(TimeSpan.FromMinutes(5), token);
}

...

var done = new CancellationTokenSource(TimeSpan.FromHours(1));
Task checkingTask = CheckAsync(done.Token);
// When checkingTask completes:
//   IsCanceled -> One hour passed with no errors.
//   IsFaulted -> The web service failed.
person Stephen Cleary    schedule 08.03.2013

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
comment
kelas Timer Anda adalah system.Threading atau system.Timers.Timer - person Abhishek Gupta; 08.03.2013
comment
Sistem.Windows.Forms.Timer - person ceth; 08.03.2013