Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
IncrementingPollingCounter menggunakan panggilan balik untuk mengambil nilai metrik saat ini dan melaporkannya melalui EventSource peristiwa. Di masa lalu, pemanggilan panggilan balik pertama mungkin terjadi secara sinkron pada utas apa pun yang memungkinkan EventSource; pemanggilan di masa depan terjadi pada utas timer khusus. Mulai dari .NET 9, panggilan balik pertama selalu terjadi secara asinkron pada utas timer. Ini dapat mengakibatkan perubahan penghitung yang terjadi tepat setelah penghitung diaktifkan tidak ditayangkan karena panggilan balik pertama terjadi nanti.
Perubahan ini kemungkinan besar akan memengaruhi pengujian yang digunakan EventListener untuk memvalidasi IncrementingPollingCounter. Jika pengujian mengaktifkan penghitung dan kemudian segera memodifikasi status yang sedang dijajaki oleh penghitung, modifikasi itu sekarang mungkin terjadi sebelum pertama kali panggilan balik dipanggil (dan lugas).
Perilaku sebelumnya
Sebelumnya, ketika IncrementingPollingCounter diaktifkan, pemanggilan panggilan balik pertama mungkin terjadi secara sinkron pada utas yang melakukan operasi pengaktifan.
Aplikasi sampel ini memanggil delegasi () => SomeInterestingValue pada Main utas dalam panggilan ke EnableEvents(). Panggilan balik itu akan mengamati log.SomeInterestingValue adalah 0. Panggilan selanjutnya dari utas timer khusus akan diamati log.SomeInterestingValue diubah menjadi 1, dan peristiwa akan dikirim dengan Increment value = 1.
using System.Diagnostics.Tracing;
var log = MyEventSource.Log;
using var listener = new Listener();
log.SomeInterestingValue++;
Console.ReadKey();
class MyEventSource : EventSource
{
public static MyEventSource Log { get; } = new();
private IncrementingPollingCounter? _counter;
public int SomeInterestingValue;
private MyEventSource() : base(nameof(MyEventSource))
{
_counter = new IncrementingPollingCounter("counter", this, () => SomeInterestingValue);
}
}
class Listener : EventListener
{
protected override void OnEventSourceCreated(EventSource eventSource)
{
if (eventSource.Name == nameof(MyEventSource))
{
EnableEvents(eventSource, EventLevel.Informational, EventKeywords.None,
new Dictionary<string, string?> { { "EventCounterIntervalSec", "1.0" } });
}
}
protected override void OnEventWritten(EventWrittenEventArgs eventData)
{
if (eventData.EventSource.Name == "EventCounters")
{
var counters = (IDictionary<string, object>)eventData.Payload![0]!;
Console.WriteLine($"Increment: {counters["Increment"]}");
}
}
}
Perilaku yang baru
Menggunakan cuplikan kode yang sama dengan bagian Perilaku sebelumnya, pemanggilan panggilan balik pertama terjadi secara asinkron pada utas timer. Ini mungkin atau mungkin tidak terjadi sebelum Main utas berjalan log.SomeInterestingValue++ tergantung pada bagaimana OS menjadwalkan beberapa utas.
Tergantung pada waktu tersebut, aplikasi menghasilkan "Increment=0" atau "Increment=1".
Versi yang diperkenalkan
.NET 9 RC 1
Jenis perubahan yang melanggar
Perubahan ini adalah perubahan perilaku.
Alasan untuk berubah
Perubahan dilakukan untuk mengatasi potensi kebuntuan yang dapat terjadi menjalankan fungsi panggilan balik saat EventListener kunci ditahan.
Tindakan yang direkomendasikan
Tidak ada tindakan yang diperlukan untuk skenario yang digunakan IncrementingPollingCounters untuk memvisualisasikan metrik di alat pemantauan eksternal. Skenario ini harus terus bekerja secara normal.
Untuk skenario yang melakukan pengujian dalam proses atau konsumsi data penghitung lainnya melalui EventListener, periksa apakah kode Anda mengharapkan untuk mengamati modifikasi tertentu pada nilai penghitung yang dibuat pada utas yang sama yang disebut EnableEvents(). Jika ya, sebaiknya tunggu untuk mengamati setidaknya satu peristiwa penghitung dari EventListener, lalu memodifikasi nilai penghitung. Misalnya, untuk memastikan bahwa cuplikan kode contoh mencetak "Increment=1", Anda dapat menambahkan ManualResetEvent ke EventListener, memberi sinyal ketika peristiwa penghitung pertama diterima, dan menunggunya sebelum memanggil log.SomeInterestingValue++.