More options for disconnect (#1557)

* Expose more options in disconnect options.

* Expose more options in disconnect API.

* Refactor code.

* Expose user properties in disconnected event.

* Expose more disconnect options in server.

* Fix build errors

* Add new samples.

* Fix client cleanup

* Fix merge conflicts
This commit is contained in:
Christian
2022-12-23 17:09:02 +01:00
committed by GitHub
parent abe7bbda15
commit fdf00f1b18
28 changed files with 752 additions and 366 deletions
+41 -3
View File
@@ -2,8 +2,9 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using MQTTnet.Diagnostics;
using System;
using System.Threading.Tasks;
using MQTTnet.Diagnostics;
namespace MQTTnet.Internal
{
@@ -11,7 +12,8 @@ namespace MQTTnet.Internal
{
public static void RunInBackground(this Task task, MqttNetSourceLogger logger = null)
{
task?.ContinueWith(t =>
task?.ContinueWith(
t =>
{
// Consume the exception first so that we get no exception regarding the not observed exception.
var exception = t.Exception;
@@ -19,5 +21,41 @@ namespace MQTTnet.Internal
},
TaskContinuationOptions.OnlyOnFaulted);
}
public static async Task WaitAsync(this Task task, Task sender, MqttNetSourceLogger logger)
{
if (logger == null)
{
throw new ArgumentNullException(nameof(logger));
}
if (task == null)
{
return;
}
if (task == sender)
{
// Return here to avoid deadlocks, but first any eventual exception in the task
// must be handled to avoid not getting an unhandled task exception
if (!task.IsFaulted)
{
return;
}
// By accessing the Exception property the exception is considered handled and will
// not result in an unhandled task exception later by the finalizer
logger.Warning(task.Exception, "Error while waiting for background task.");
return;
}
try
{
await task.ConfigureAwait(false);
}
catch (OperationCanceledException)
{
}
}
}
}
}