From 3a2aed681177fb786797c16436bdc47c90167852 Mon Sep 17 00:00:00 2001 From: Omar Gonzalez Date: Wed, 14 Jul 2021 12:38:03 -0700 Subject: [PATCH 1/3] Fixed deadlock in caller's Task.WhenAll When Task.Factory.StartNew is called with an already cancelled token, the resulting task never reaches completed. --- Open.Nat/Discovery/Searcher.cs | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/Open.Nat/Discovery/Searcher.cs b/Open.Nat/Discovery/Searcher.cs index b409fc6..9108fc2 100644 --- a/Open.Nat/Discovery/Searcher.cs +++ b/Open.Nat/Discovery/Searcher.cs @@ -61,16 +61,19 @@ public Task> Search(CancellationToken cancelationToken) #else public async Task> Search(CancellationToken cancelationToken) { - await Task.Factory.StartNew(_ => - { - NatDiscoverer.TraceSource.LogInfo("Searching for: {0}", GetType().Name); - while (!cancelationToken.IsCancellationRequested) - { - Discover(cancelationToken); - Receive(cancelationToken); - } - CloseUdpClients(); - }, null, cancelationToken); + if (!cancelationToken.IsCancellationRequested) + { + await Task.Factory.StartNew(_ => + { + NatDiscoverer.TraceSource.LogInfo("Searching for: {0}", GetType().Name); + while (!cancelationToken.IsCancellationRequested) + { + Discover(cancelationToken); + Receive(cancelationToken); + } + CloseUdpClients(); + }, null, cancelationToken); + } return _devices; } #endif From a9a90cc3e8fdc5166acb11613688c523a432aa1e Mon Sep 17 00:00:00 2001 From: Omar Gonzalez Date: Mon, 10 Jan 2022 14:17:10 -0800 Subject: [PATCH 2/3] Replace IsCancellationRequested with ThrowIfCancellationRequested Also switched to tabs --- Open.Nat/Discovery/Searcher.cs | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/Open.Nat/Discovery/Searcher.cs b/Open.Nat/Discovery/Searcher.cs index 9108fc2..61c237c 100644 --- a/Open.Nat/Discovery/Searcher.cs +++ b/Open.Nat/Discovery/Searcher.cs @@ -46,6 +46,8 @@ internal abstract class Searcher #if NET35 public Task> Search(CancellationToken cancelationToken) { + cancelationToken.ThrowIfCancellationRequested(); + return Task.Factory.StartNew(_ => { NatDiscoverer.TraceSource.LogInfo("Searching for: {0}", GetType().Name); @@ -61,19 +63,18 @@ public Task> Search(CancellationToken cancelationToken) #else public async Task> Search(CancellationToken cancelationToken) { - if (!cancelationToken.IsCancellationRequested) - { - await Task.Factory.StartNew(_ => - { - NatDiscoverer.TraceSource.LogInfo("Searching for: {0}", GetType().Name); - while (!cancelationToken.IsCancellationRequested) - { - Discover(cancelationToken); - Receive(cancelationToken); - } - CloseUdpClients(); - }, null, cancelationToken); - } + cancelationToken.ThrowIfCancellationRequested(); + + await Task.Factory.StartNew(_ => + { + NatDiscoverer.TraceSource.LogInfo("Searching for: {0}", GetType().Name); + while (!cancelationToken.IsCancellationRequested) + { + Discover(cancelationToken); + Receive(cancelationToken); + } + CloseUdpClients(); + }, null, cancelationToken); return _devices; } #endif From b34cf0d986125f44192e1c87cbbde6096cd8d974 Mon Sep 17 00:00:00 2001 From: Omar Gonzalez Date: Mon, 10 Jan 2022 14:19:25 -0800 Subject: [PATCH 3/3] Fixed indent level --- Open.Nat/Discovery/Searcher.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Open.Nat/Discovery/Searcher.cs b/Open.Nat/Discovery/Searcher.cs index 61c237c..76c7636 100644 --- a/Open.Nat/Discovery/Searcher.cs +++ b/Open.Nat/Discovery/Searcher.cs @@ -66,15 +66,15 @@ public async Task> Search(CancellationToken cancelationTo cancelationToken.ThrowIfCancellationRequested(); await Task.Factory.StartNew(_ => - { - NatDiscoverer.TraceSource.LogInfo("Searching for: {0}", GetType().Name); - while (!cancelationToken.IsCancellationRequested) { - Discover(cancelationToken); - Receive(cancelationToken); - } - CloseUdpClients(); - }, null, cancelationToken); + NatDiscoverer.TraceSource.LogInfo("Searching for: {0}", GetType().Name); + while (!cancelationToken.IsCancellationRequested) + { + Discover(cancelationToken); + Receive(cancelationToken); + } + CloseUdpClients(); + }, null, cancelationToken); return _devices; } #endif