1111using System . Collections ;
1212using System . Collections . Generic ;
1313using System . Diagnostics ;
14+ using System . Threading ;
1415using System . Threading . Tasks ;
1516
1617#endregion
@@ -30,6 +31,7 @@ public class ServiceBrowser : IServiceBrowser, IDisposable
3031
3132 private readonly Native . DNSServiceBrowseReply browseReplyHandler ;
3233 private readonly Dictionary < string , IResolvableService > serviceTable = new ( ) ;
34+ private readonly SemaphoreSlim serviceTableSemaphore = new ( 1 , 1 ) ;
3335
3436 private AddressProtocol address_protocol ;
3537 private string domain ;
@@ -54,11 +56,16 @@ public void Browse (uint interfaceIndex, AddressProtocol addressProtocol, string
5456
5557 public IEnumerator < IResolvableService > GetEnumerator ( )
5658 {
57- lock ( this )
59+ serviceTableSemaphore . Wait ( ) ;
60+ try
5861 {
5962 foreach ( var service in this . serviceTable . Values )
6063 yield return service ;
6164 }
65+ finally
66+ {
67+ serviceTableSemaphore . Release ( ) ;
68+ }
6269 }
6370
6471 IEnumerator IEnumerable . GetEnumerator ( ) => this . GetEnumerator ( ) ;
@@ -152,23 +159,29 @@ private void OnBrowseReply (ServiceRef sdRef,
152159
153160 if ( ( flags & ServiceFlags . Add ) != 0 )
154161 {
155- lock ( this . serviceTable )
162+ serviceTableSemaphore. Wait ( ) ;
163+ try
164+ {
165+ this . serviceTable [ name ] = service ;
166+ }
167+ finally
156168 {
157- if ( this . serviceTable . ContainsKey ( name ) )
158- this. serviceTable [ name ] = service ;
159- else
160- this . serviceTable . Add ( name , service ) ;
169+ serviceTableSemaphore . Release ( ) ;
161170 }
162171
163172 var handler = this . ServiceAdded ;
164173 handler ? . Invoke ( this , args ) ;
165174 }
166175 else
167176 {
168- lock ( this . serviceTable )
177+ serviceTableSemaphore . Wait ( ) ;
178+ try
179+ {
180+ this . serviceTable . Remove ( name ) ;
181+ }
182+ finally
169183 {
170- if ( this . serviceTable . ContainsKey ( name ) )
171- this. serviceTable . Remove ( name ) ;
184+ serviceTableSemaphore . Release ( ) ;
172185 }
173186
174187 var handler = this . ServiceRemoved ;
0 commit comments