1212using System . Collections . Generic ;
1313using System . Diagnostics ;
1414using System . Runtime . InteropServices ;
15+ using System . Threading ;
1516using System . Threading . Tasks ;
1617
1718#endregion
@@ -31,6 +32,7 @@ public class ServiceBrowser : IServiceBrowser, IDisposable
3132
3233 private readonly Native . DNSServiceBrowseReply browseReplyHandler ;
3334 private readonly Dictionary < string , IResolvableService > serviceTable = new ( ) ;
35+ private readonly SemaphoreSlim serviceTableSemaphore = new ( 1 , 1 ) ;
3436
3537 private AddressProtocol address_protocol ;
3638 private string domain ;
@@ -55,11 +57,16 @@ public void Browse (uint interfaceIndex, AddressProtocol addressProtocol, string
5557
5658 public IEnumerator < IResolvableService > GetEnumerator ( )
5759 {
58- lock ( this )
60+ serviceTableSemaphore . Wait ( ) ;
61+ try
5962 {
6063 foreach ( var service in this . serviceTable . Values )
6164 yield return service ;
6265 }
66+ finally
67+ {
68+ serviceTableSemaphore . Release ( ) ;
69+ }
6370 }
6471
6572 IEnumerator IEnumerable . GetEnumerator ( ) => this . GetEnumerator ( ) ;
@@ -153,23 +160,29 @@ private void OnBrowseReply (ServiceRef sdRef,
153160
154161 if ( ( flags & ServiceFlags . Add ) != 0 )
155162 {
156- lock ( this . serviceTable )
163+ serviceTableSemaphore. Wait ( ) ;
164+ try
165+ {
166+ this . serviceTable [ name ] = service ;
167+ }
168+ finally
157169 {
158- if ( this . serviceTable . ContainsKey ( name ) )
159- this. serviceTable [ name ] = service ;
160- else
161- this . serviceTable . Add ( name , service ) ;
170+ serviceTableSemaphore . Release ( ) ;
162171 }
163172
164173 var handler = this . ServiceAdded ;
165174 handler ? . Invoke ( this , args ) ;
166175 }
167176 else
168177 {
169- lock ( this . serviceTable )
178+ serviceTableSemaphore . Wait ( ) ;
179+ try
180+ {
181+ this . serviceTable . Remove ( name ) ;
182+ }
183+ finally
170184 {
171- if ( this . serviceTable . ContainsKey ( name ) )
172- this. serviceTable . Remove ( name ) ;
185+ serviceTableSemaphore . Release ( ) ;
173186 }
174187
175188 var handler = this . ServiceRemoved ;
0 commit comments