mirror of
https://github.com/dotnet/MQTTnet.git
synced 2026-10-19 19:13:11 +08:00
Refactor message processing and async/await usage.
This commit is contained in:
@@ -65,7 +65,7 @@ namespace MQTTnet.Benchmarks
|
||||
|
||||
for (var i = 0; i < 10000; i++)
|
||||
{
|
||||
_channelAdapter.SendPacketAsync(TimeSpan.FromSeconds(15), _packet, CancellationToken.None).GetAwaiter().GetResult();
|
||||
_channelAdapter.SendPacketAsync(_packet, CancellationToken.None).GetAwaiter().GetResult();
|
||||
}
|
||||
|
||||
_stream.Position = 0;
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using MQTTnet.Serializer;
|
||||
|
||||
namespace MQTTnet.Core.Tests
|
||||
{
|
||||
[TestClass]
|
||||
public class ByteReaderTests
|
||||
{
|
||||
[TestMethod]
|
||||
public void ByteReader_ReadToEnd()
|
||||
{
|
||||
var reader = new ByteReader(85);
|
||||
Assert.IsTrue(reader.Read());
|
||||
Assert.IsFalse(reader.Read());
|
||||
Assert.IsTrue(reader.Read());
|
||||
Assert.IsFalse(reader.Read());
|
||||
Assert.IsTrue(reader.Read());
|
||||
Assert.IsFalse(reader.Read());
|
||||
Assert.IsTrue(reader.Read());
|
||||
Assert.IsFalse(reader.Read());
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ByteReader_ReadPartial()
|
||||
{
|
||||
var reader = new ByteReader(15);
|
||||
Assert.AreEqual(3, reader.Read(2));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,51 +0,0 @@
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using MQTTnet.Serializer;
|
||||
|
||||
namespace MQTTnet.Core.Tests
|
||||
{
|
||||
[TestClass]
|
||||
public class ByteWriterTests
|
||||
{
|
||||
[TestMethod]
|
||||
public void ByteWriter_WriteMultipleAll()
|
||||
{
|
||||
var b = new ByteWriter();
|
||||
Assert.AreEqual(0, b.Value);
|
||||
b.Write(3, 2);
|
||||
Assert.AreEqual(3, b.Value);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ByteWriter_WriteMultiplePartial()
|
||||
{
|
||||
var b = new ByteWriter();
|
||||
Assert.AreEqual(0, b.Value);
|
||||
b.Write(255, 2);
|
||||
Assert.AreEqual(3, b.Value);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ByteWriter_WriteTo0xFF()
|
||||
{
|
||||
var b = new ByteWriter();
|
||||
|
||||
Assert.AreEqual(0, b.Value);
|
||||
b.Write(true);
|
||||
Assert.AreEqual(1, b.Value);
|
||||
b.Write(true);
|
||||
Assert.AreEqual(3, b.Value);
|
||||
b.Write(true);
|
||||
Assert.AreEqual(7, b.Value);
|
||||
b.Write(true);
|
||||
Assert.AreEqual(15, b.Value);
|
||||
b.Write(true);
|
||||
Assert.AreEqual(31, b.Value);
|
||||
b.Write(true);
|
||||
Assert.AreEqual(63, b.Value);
|
||||
b.Write(true);
|
||||
Assert.AreEqual(127, b.Value);
|
||||
b.Write(true);
|
||||
Assert.AreEqual(255, b.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -14,20 +14,20 @@ namespace MQTTnet.Core.Tests
|
||||
[TestMethod]
|
||||
public async Task TimeoutAfter()
|
||||
{
|
||||
await MQTTnet.Internal.TaskExtensions.TimeoutAfter(ct => Task.Delay(TimeSpan.FromMilliseconds(500), ct), TimeSpan.FromMilliseconds(100), CancellationToken.None);
|
||||
await MQTTnet.Internal.TaskExtensions.TimeoutAfterAsync(ct => Task.Delay(TimeSpan.FromMilliseconds(500), ct), TimeSpan.FromMilliseconds(100), CancellationToken.None);
|
||||
}
|
||||
|
||||
[ExpectedException(typeof(MqttCommunicationTimedOutException))]
|
||||
[TestMethod]
|
||||
public async Task TimeoutAfterWithResult()
|
||||
{
|
||||
await MQTTnet.Internal.TaskExtensions.TimeoutAfter(ct => Task.Delay(TimeSpan.FromMilliseconds(500), ct).ContinueWith(t => 5, ct), TimeSpan.FromMilliseconds(100), CancellationToken.None);
|
||||
await MQTTnet.Internal.TaskExtensions.TimeoutAfterAsync(ct => Task.Delay(TimeSpan.FromMilliseconds(500), ct).ContinueWith(t => 5, ct), TimeSpan.FromMilliseconds(100), CancellationToken.None);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task TimeoutAfterCompleteInTime()
|
||||
{
|
||||
var result = await MQTTnet.Internal.TaskExtensions.TimeoutAfter(ct => Task.Delay(TimeSpan.FromMilliseconds(100), ct).ContinueWith(t => 5, ct), TimeSpan.FromMilliseconds(500), CancellationToken.None);
|
||||
var result = await MQTTnet.Internal.TaskExtensions.TimeoutAfterAsync(ct => Task.Delay(TimeSpan.FromMilliseconds(100), ct).ContinueWith(t => 5, ct), TimeSpan.FromMilliseconds(500), CancellationToken.None);
|
||||
Assert.AreEqual(5, result);
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ namespace MQTTnet.Core.Tests
|
||||
{
|
||||
try
|
||||
{
|
||||
await MQTTnet.Internal.TaskExtensions.TimeoutAfter(ct => Task.Run(() =>
|
||||
await MQTTnet.Internal.TaskExtensions.TimeoutAfterAsync(ct => Task.Run(() =>
|
||||
{
|
||||
var iis = new int[0];
|
||||
iis[1] = 0;
|
||||
@@ -55,7 +55,7 @@ namespace MQTTnet.Core.Tests
|
||||
{
|
||||
try
|
||||
{
|
||||
await MQTTnet.Internal.TaskExtensions.TimeoutAfter(ct => Task.Run(() =>
|
||||
await MQTTnet.Internal.TaskExtensions.TimeoutAfterAsync(ct => Task.Run(() =>
|
||||
{
|
||||
var iis = new int[0];
|
||||
iis[1] = 0;
|
||||
@@ -76,7 +76,7 @@ namespace MQTTnet.Core.Tests
|
||||
var tasks = Enumerable.Range(0, 100000)
|
||||
.Select(i =>
|
||||
{
|
||||
return MQTTnet.Internal.TaskExtensions.TimeoutAfter(ct => Task.Delay(TimeSpan.FromMilliseconds(1), ct), TimeSpan.FromMinutes(1), CancellationToken.None);
|
||||
return MQTTnet.Internal.TaskExtensions.TimeoutAfterAsync(ct => Task.Delay(TimeSpan.FromMilliseconds(1), ct), TimeSpan.FromMinutes(1), CancellationToken.None);
|
||||
});
|
||||
|
||||
await Task.WhenAll(tasks);
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace MQTTnet.Core.Tests
|
||||
public class MqttPacketReaderTests
|
||||
{
|
||||
[TestMethod]
|
||||
[ExpectedException(typeof(MqttCommunicationException))]
|
||||
[ExpectedException(typeof(MqttCommunicationClosedGracefullyException))]
|
||||
public void MqttPacketReader_EmptyStream()
|
||||
{
|
||||
MqttPacketReader.ReadFixedHeaderAsync(new TestMqttChannel(new MemoryStream()), CancellationToken.None).GetAwaiter().GetResult();
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using MQTTnet.Adapter;
|
||||
@@ -36,7 +35,7 @@ namespace MQTTnet.Core.Tests
|
||||
return Task.FromResult(0);
|
||||
}
|
||||
|
||||
public Task SendPacketAsync(TimeSpan timeout, MqttBasePacket packet, CancellationToken cancellationToken)
|
||||
public Task SendPacketAsync(MqttBasePacket packet, CancellationToken cancellationToken)
|
||||
{
|
||||
ThrowIfPartnerIsNull();
|
||||
|
||||
|
||||
@@ -12,16 +12,46 @@ namespace MQTTnet.TestApp.NetCore
|
||||
{
|
||||
public static class PerformanceTest
|
||||
{
|
||||
public static async Task RunAsync()
|
||||
public static void Run()
|
||||
{
|
||||
Console.WriteLine("Press 'c' for concurrent sends. Otherwise in one batch.");
|
||||
var concurrent = Console.ReadKey(true).KeyChar == 'c';
|
||||
try
|
||||
{
|
||||
var mqttServer = new MqttFactory().CreateMqttServer();
|
||||
mqttServer.StartAsync(new MqttServerOptions()).GetAwaiter().GetResult();
|
||||
|
||||
var server = Task.Run(RunServerAsync);
|
||||
await Task.Delay(1000);
|
||||
var client = Task.Run(() => RunClientAsync(2000, TimeSpan.FromMilliseconds(10), concurrent));
|
||||
var options = new MqttClientOptions
|
||||
{
|
||||
ChannelOptions = new MqttClientTcpOptions
|
||||
{
|
||||
Server = "127.0.0.1"
|
||||
},
|
||||
CleanSession = true
|
||||
};
|
||||
|
||||
await Task.WhenAll(server, client).ConfigureAwait(false);
|
||||
var client = new MqttFactory().CreateMqttClient();
|
||||
client.ConnectAsync(options).GetAwaiter().GetResult();
|
||||
|
||||
var message = CreateMessage();
|
||||
var stopwatch = new Stopwatch();
|
||||
|
||||
for (var i = 0; i < 10; i++)
|
||||
{
|
||||
stopwatch.Restart();
|
||||
|
||||
var sentMessagesCount = 0;
|
||||
while (stopwatch.ElapsedMilliseconds < 1000)
|
||||
{
|
||||
client.PublishAsync(message).GetAwaiter().GetResult();
|
||||
sentMessagesCount++;
|
||||
}
|
||||
|
||||
Console.WriteLine($"Sending {sentMessagesCount} messages per second. #" + (i + 1));
|
||||
}
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
Console.WriteLine(exception);
|
||||
}
|
||||
}
|
||||
|
||||
private static Task RunClientsAsync(int msgChunkSize, TimeSpan interval, bool concurrent)
|
||||
@@ -53,29 +83,8 @@ namespace MQTTnet.TestApp.NetCore
|
||||
}
|
||||
|
||||
var message = CreateMessage();
|
||||
var messages = new[] { message };
|
||||
|
||||
var stopwatch = Stopwatch.StartNew();
|
||||
|
||||
var sentMessagesCount = 0;
|
||||
while (stopwatch.ElapsedMilliseconds < 1000)
|
||||
{
|
||||
client.PublishAsync(messages).GetAwaiter().GetResult();
|
||||
sentMessagesCount++;
|
||||
}
|
||||
|
||||
Console.WriteLine($"Sending {sentMessagesCount} messages per second. #1");
|
||||
|
||||
sentMessagesCount = 0;
|
||||
stopwatch.Restart();
|
||||
while (stopwatch.ElapsedMilliseconds < 1000)
|
||||
{
|
||||
await client.PublishAsync(messages).ConfigureAwait(false);
|
||||
sentMessagesCount++;
|
||||
}
|
||||
|
||||
Console.WriteLine($"Sending {sentMessagesCount} messages per second. #2");
|
||||
|
||||
var testMessageCount = 10000;
|
||||
for (var i = 0; i < testMessageCount; i++)
|
||||
{
|
||||
@@ -142,38 +151,5 @@ namespace MQTTnet.TestApp.NetCore
|
||||
Interlocked.Increment(ref count);
|
||||
return Task.Run(() => client.PublishAsync(applicationMessage));
|
||||
}
|
||||
|
||||
private static async Task RunServerAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
var mqttServer = new MqttFactory().CreateMqttServer();
|
||||
|
||||
////var msgs = 0;
|
||||
////var stopwatch = Stopwatch.StartNew();
|
||||
////mqttServer.ApplicationMessageReceived += (sender, args) =>
|
||||
////{
|
||||
//// msgs++;
|
||||
//// if (stopwatch.ElapsedMilliseconds > 1000)
|
||||
//// {
|
||||
//// Console.WriteLine($"received {msgs}");
|
||||
//// msgs = 0;
|
||||
//// stopwatch.Restart();
|
||||
//// }
|
||||
////};
|
||||
await mqttServer.StartAsync(new MqttServerOptions());
|
||||
|
||||
Console.WriteLine("Press any key to exit.");
|
||||
Console.ReadLine();
|
||||
|
||||
await mqttServer.StopAsync().ConfigureAwait(false);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine(e);
|
||||
}
|
||||
|
||||
Console.ReadLine();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,7 +34,8 @@ namespace MQTTnet.TestApp.NetCore
|
||||
}
|
||||
else if (pressedKey.KeyChar == '3')
|
||||
{
|
||||
Task.Run(PerformanceTest.RunAsync);
|
||||
PerformanceTest.Run();
|
||||
return;
|
||||
}
|
||||
else if (pressedKey.KeyChar == '4')
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user