@@ -400,6 +400,82 @@ public void RemoveSocket()
400
400
}
401
401
}
402
402
403
+ [ Fact ]
404
+ public async void RemoveAndDisposeSocket ( )
405
+ {
406
+ //set up poller, start it
407
+ var patient = new NetMQPoller ( ) ;
408
+ patient . RunAsync ( ) ;
409
+
410
+ Assert . True ( patient . IsRunning ) ;
411
+
412
+ //create a pub-sub pair
413
+ var port = 55667 ;
414
+ var conn = $ "tcp://127.0.0.1:{ port } ";
415
+
416
+ var pub = new PublisherSocket ( ) ;
417
+ pub . Bind ( conn ) ;
418
+
419
+ var sub = new SubscriberSocket ( ) ;
420
+ sub . Connect ( conn ) ;
421
+ sub . SubscribeToAnyTopic ( ) ;
422
+
423
+ //handle callbacks from poller thread
424
+ sub . ReceiveReady += ( s , e ) =>
425
+ {
426
+ var msg = e . Socket . ReceiveFrameString ( ) ;
427
+
428
+ Debug . WriteLine ( $ "sub has data: { msg } ") ;
429
+ } ;
430
+
431
+ //add the subscriber socket to poller
432
+ patient . Add ( sub ) ;
433
+
434
+ //set up pub on separate thread
435
+ var canceller = new CancellationTokenSource ( ) ;
436
+
437
+ var pubAction = new Action ( async ( ) =>
438
+ {
439
+ var token = canceller . Token ;
440
+
441
+ uint i = 0 ;
442
+
443
+ while ( ! token . IsCancellationRequested )
444
+ {
445
+ pub . SendFrame ( $ "Hello-{ ++ i } ") ;
446
+
447
+ // send ~ 5Hz
448
+ await Task . Delay ( 200 ) ;
449
+ }
450
+ } ) ;
451
+
452
+ //var pubThread = new Task(pubAction, canceller.Token, TaskCreationOptions.LongRunning | TaskCreationOptions.AttachedToParent);
453
+ //pubThread.Start();
454
+
455
+ var pubThread = Task . Run ( pubAction ) ;
456
+
457
+ //allow a little time to run
458
+ await Task . Delay ( 5000 ) ;
459
+
460
+ //now try to remove the sub from poller
461
+ patient . Remove ( sub ) ;
462
+
463
+ // dispose the sub (this will cause exception on poller's worker-thread) and it can't be caught!
464
+ sub . Dispose ( ) ;
465
+
466
+ //allow for poller to continue running
467
+ await Task . Delay ( 3000 ) ;
468
+
469
+ patient . Stop ( ) ;
470
+ Assert . False ( patient . IsRunning ) ;
471
+
472
+ canceller . Cancel ( ) ;
473
+
474
+ //patient?.Dispose();
475
+ pub ? . Dispose ( ) ;
476
+ sub ? . Dispose ( ) ;
477
+ }
478
+
403
479
[ Fact ]
404
480
public void AddThrowsIfSocketAlreadyDisposed ( )
405
481
{
0 commit comments