Saya ingin metode untuk memeriksa setiap 15 detik jika perangkat tertentu terhubung/driver untuk itu digunakan.

Jadi sesuatu seperti:

Every 15 seconds 
{
if (Device is connected)
  {
   do sth.;
   exit loop;
  }      
}

Sejauh ini saya dapat membuat Timer yang tampaknya berfungsi:

{
System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 15000;
timer.Elapsed += CheckConnection;
timer.Start();
}

Sayangnya saya tidak memiliki petunjuk nyata bagaimana cara keluar/membatalkan penghitung waktu setelah Metode CheckConnection saya benar/menemukan perangkat terhubung.

c#
0
G.M 20 November 2020, 11:36

1 menjawab

Jawaban Terbaik

Berikut adalah contoh aplikasi yang menunjukkan bagaimana Anda dapat menggunakan kebijakan Coba Ulang Polly untuk mencapai perilaku yang diinginkan.

Misalkan kelas Device Anda terlihat seperti ini:

public class Device
{
    private int ConnectionAttempts = 0;
    private const int WhenShouldConnectionSucceed = 7;

    public bool CheckConnection() => ConnectionAttempts == WhenShouldConnectionSucceed;

    public void Connect() => ConnectionAttempts++;
}
  • Ini meningkatkan ConnectionAttempts setiap kali metode Connect dipanggil.
  • Ketika penghitung upaya sama dengan nilai yang telah ditentukan maka CheckConnection akan mengembalikan true (ini mensimulasikan koneksi yang berhasil) jika tidak false.

Pengaturan kebijakan coba lagi terlihat seperti ini:

var retry = Policy<Device>.HandleResult(result => !result.CheckConnection())
    .WaitAndRetryForever(_ => TimeSpan.FromSeconds(15),
        onRetry: (result, duration) => Console.WriteLine("Retry has been initiated"));
    
var device = new Device();
retry.Execute(() =>
{
    device.Connect();
    return device;
});

  • Sampai perangkat tertentu tidak terhubung (!result.CheckConnection()) ia akan mencoba lagi selamanya (WaitAndRetryForever) metode Connect.
  • Di antara setiap percobaan ulang, ia menunggu 15 detik (TimeSpan.FromSeconds(15)).
  • Delegasi onRetry digunakan di sini hanya untuk tujuan demonstrasi. onRetry adalah opsional.

Jadi, jika saya memiliki aplikasi konsol sederhana berikut:

class Program
{
    static void Main(string[] args)
    {
        var retry = Policy<Device>.HandleResult(result => !result.CheckConnection())
            .WaitAndRetryForever(_ => TimeSpan.FromSeconds(15),
                onRetry: (result, duration) => Console.WriteLine("Retry has been initiated"));

        var device = new Device();
        retry.Execute(() =>
        {
            device.Connect();
            return device;
        });
        Console.WriteLine("Device has been connected");
    }
}

Maka akan mencetak baris berikut ke output:

Retry has been initiated
Retry has been initiated
Retry has been initiated
Retry has been initiated
Retry has been initiated
Retry has been initiated
Device has been connected
2
Peter Csala 20 November 2020, 09:12