@@ -32,6 +32,7 @@ namespace Grpc.Tests.Shared;
32
32
33
33
internal class TestResolver : PollingResolver
34
34
{
35
+ private readonly object _lock ;
35
36
private readonly Func < Task > ? _onRefreshAsync ;
36
37
private readonly TaskCompletionSource < object ? > _hasResolvedTcs ;
37
38
private readonly ILogger _logger ;
@@ -45,6 +46,7 @@ public TestResolver(ILoggerFactory loggerFactory) : this(loggerFactory, null)
45
46
46
47
public TestResolver ( ILoggerFactory ? loggerFactory = null , Func < Task > ? onRefreshAsync = null ) : base ( loggerFactory ?? NullLoggerFactory . Instance )
47
48
{
49
+ _lock = new object ( ) ;
48
50
_onRefreshAsync = onRefreshAsync ;
49
51
_hasResolvedTcs = new TaskCompletionSource < object ? > ( TaskCreationOptions . RunContinuationsAsynchronously ) ;
50
52
_logger = ( ILogger ? ) loggerFactory ? . CreateLogger < TestResolver > ( ) ?? NullLogger . Instance ;
@@ -64,8 +66,11 @@ public void UpdateError(Status status)
64
66
65
67
public void UpdateResult ( ResolverResult result )
66
68
{
67
- _result = result ;
68
- Listener ? . Invoke ( result ) ;
69
+ lock ( _lock )
70
+ {
71
+ _result = result ;
72
+ Listener ? . Invoke ( result ) ;
73
+ }
69
74
}
70
75
71
76
protected override async Task ResolveAsync ( CancellationToken cancellationToken )
@@ -75,7 +80,10 @@ protected override async Task ResolveAsync(CancellationToken cancellationToken)
75
80
await _onRefreshAsync ( ) ;
76
81
}
77
82
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
+ }
79
87
_hasResolvedTcs . TrySetResult ( null ) ;
80
88
}
81
89
}
0 commit comments