From f36fd360df4502be5c18807a606aa41806bbb033 Mon Sep 17 00:00:00 2001 From: Petr Onderka Date: Fri, 10 Jul 2026 16:42:56 +0200 Subject: [PATCH 1/2] Use async ChangeToken.OnChange overload in FileConfigurationProvider Replace the blocking Thread.Sleep in the reload callback with an awaited Task.Delay, using the new async Func overload of ChangeToken.OnChange (#69099). This avoids blocking a thread for the duration of the reload delay. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 059bf1b8-31e2-4608-a038-210880f90d06 --- .../src/FileConfigurationProvider.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationProvider.cs b/src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationProvider.cs index f84ed8ead309ef..c2c7dbcf717256 100644 --- a/src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationProvider.cs +++ b/src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationProvider.cs @@ -6,7 +6,7 @@ using System.IO; using System.Runtime.ExceptionServices; using System.Text; -using System.Threading; +using System.Threading.Tasks; using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Primitives; @@ -33,9 +33,9 @@ public FileConfigurationProvider(FileConfigurationSource source) { _changeTokenRegistration = ChangeToken.OnChange( () => Source.FileProvider.Watch(Source.Path!), - () => + async () => { - Thread.Sleep(Source.ReloadDelay); + await Task.Delay(Source.ReloadDelay).ConfigureAwait(false); Load(reload: true); }); } From 7cbf729af01e43ea1380d8b07a5a8ff5d020cc48 Mon Sep 17 00:00:00 2001 From: Petr Onderka Date: Mon, 13 Jul 2026 14:35:44 +0200 Subject: [PATCH 2/2] Addressed review feedback --- .../src/FileConfigurationProvider.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationProvider.cs b/src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationProvider.cs index c2c7dbcf717256..fa9f59683c9427 100644 --- a/src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationProvider.cs +++ b/src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationProvider.cs @@ -36,7 +36,18 @@ public FileConfigurationProvider(FileConfigurationSource source) async () => { await Task.Delay(Source.ReloadDelay).ConfigureAwait(false); - Load(reload: true); + try + { + Load(reload: true); + } + catch + { + // Load already surfaces reload failures through the + // FileConfigurationSource.OnLoadException callback. Any exception that + // escapes here is usually swallowed by OnChange or by the FileProvider, + // so swallow it here instead, to make it clear this is the intended behavior + // and to make it more consistent. + } }); } }