@@ -32,6 +32,7 @@ namespace Grpc.Tests.Shared;
3232
3333internal class TestResolver : PollingResolver
3434{
35+ private readonly object _lock ;
3536 private readonly Func < Task > ? _onRefreshAsync ;
3637 private readonly TaskCompletionSource < object ? > _hasResolvedTcs ;
3738 private readonly ILogger _logger ;
@@ -45,6 +46,7 @@ public TestResolver(ILoggerFactory loggerFactory) : this(loggerFactory, null)
4546
4647 public TestResolver ( ILoggerFactory ? loggerFactory = null , Func < Task > ? onRefreshAsync = null ) : base ( loggerFactory ?? NullLoggerFactory . Instance )
4748 {
49+ _lock = new object ( ) ;
4850 _onRefreshAsync = onRefreshAsync ;
4951 _hasResolvedTcs = new TaskCompletionSource < object ? > ( TaskCreationOptions . RunContinuationsAsynchronously ) ;
5052 _logger = ( ILogger ? ) loggerFactory ? . CreateLogger < TestResolver > ( ) ?? NullLogger . Instance ;
@@ -64,8 +66,11 @@ public void UpdateError(Status status)
6466
6567 public void UpdateResult ( ResolverResult result )
6668 {
67- _result = result ;
68- Listener ? . Invoke ( result ) ;
69+ lock ( _lock )
70+ {
71+ _result = result ;
72+ Listener ? . Invoke ( result ) ;
73+ }
6974 }
7075
7176 protected override async Task ResolveAsync ( CancellationToken cancellationToken )
@@ -75,7 +80,10 @@ protected override async Task ResolveAsync(CancellationToken cancellationToken)
7580 await _onRefreshAsync ( ) ;
7681 }
7782
78- Listener ( _result ?? ResolverResult . ForResult ( Array . Empty < BalancerAddress > ( ) , serviceConfig : null , serviceConfigStatus : null ) ) ;
83+ lock ( _lock )
84+ {
85+ Listener ( _result ?? ResolverResult . ForResult ( Array . Empty < BalancerAddress > ( ) , serviceConfig : null , serviceConfigStatus : null ) ) ;
86+ }
7987 _hasResolvedTcs . TrySetResult ( null ) ;
8088 }
8189}
0 commit comments