Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Refactoring MQTTnet.AspNetCore#2103

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Open
xljiulang wants to merge91 commits intodotnet:master
base:master
Choose a base branch
Loading
fromxljiulang:master
Open
Show file tree
Hide file tree
Changes from1 commit
Commits
Show all changes
91 commits
Select commitHold shift + click to select a range
897c551
Use IConnectionFactory to create ConnectionContext to replace SocketC…
xljiulangNov 7, 2024
f38cca3
Refactoring AspNetMQTT
xljiulangNov 12, 2024
d8c94bd
Separate AspNetCoreMqttServerAdapter from MqttConnectionHandler
xljiulangNov 13, 2024
73502e4
TryAdd IConnectionFactory as Singleton
xljiulangNov 13, 2024
3a641ab
Add some remarks
xljiulangNov 13, 2024
91763ae
Add AspNetCoreMqttNetLogger
xljiulangNov 13, 2024
9c14222
Delayed start of AspNetCoreMqttServer
xljiulangNov 13, 2024
2372352
Using fields to cache IHttpContextFeature
xljiulangNov 13, 2024
8d96e19
Update Server_ASP_NET_Samples
xljiulangNov 13, 2024
ad5c798
Use ActivatorUtilities to create TMQttServerWrapper
xljiulangNov 13, 2024
7f95f02
Add IMqttServerBuilder
xljiulangNov 13, 2024
7b44ea2
Add IMqttClientBuilder
xljiulangNov 13, 2024
73c1365
Conditionally load SocketConnectionFactoryAssembly
xljiulangNov 13, 2024
2c10d2c
Add LICENSE
xljiulangNov 13, 2024
6cda003
DynamicallyAccessedMembers
xljiulangNov 13, 2024
faaadbd
Inject IOptions<MqttServerOptionsBuilder>
xljiulangNov 13, 2024
13c9198
Change the namespace to MQTTnet.AspNetCore
xljiulangNov 13, 2024
b8d8abb
await for_aspNetCoreMqttServer.StartAsync
xljiulangNov 14, 2024
64ed638
enable Nullable
xljiulangNov 14, 2024
3526212
Always dispose _connection of AspNetCoreMqttChannelAdapter
xljiulangNov 14, 2024
b4b0b04
UseTls
xljiulangNov 14, 2024
d9e02ce
Restore the IMqttClientAdapterFactory interface
xljiulangNov 15, 2024
b5019bd
Calculate the property values ​​when constructing MqttChannel
xljiulangNov 15, 2024
c206a4a
MqttServerChannelAdapter is modified to inherit MqttChannel
xljiulangNov 15, 2024
0a216a9
Add ClientConnectionContext.WebSocket
xljiulangNov 15, 2024
580257a
Add LICENSE
xljiulangNov 15, 2024
4f6b7ae
Add support for CreateLowLevelMqttClient
xljiulangNov 15, 2024
b25159b
AddMqttClient: Use AspNetCoreMqttClientAdapterFactory as the default …
xljiulangNov 16, 2024
ecb404f
Check that UseMqtt() and MapMqtt() are used.
xljiulangNov 16, 2024
858a914
AspNetCoreMqttServerAdapter: Logging when MqttServerOptions are ignored
xljiulangNov 16, 2024
fedb631
Add IMqttServerBuilder.AddMqttServerAdapter() extensions
xljiulangNov 16, 2024
67239cd
Register MqttServerOptions and MqttServerStopOptions as services
xljiulangNov 16, 2024
e03b9b1
IMqttBuilder: Add IMqttBuilder.UseAspNetCoreMqttNetLogger() extension
xljiulangNov 16, 2024
014a50b
Remove some dead code.
xljiulangNov 16, 2024
ad62877
Apply the properties of MqttClientTcpOptions to the Socket
xljiulangNov 16, 2024
c49beb0
TlsConnectionFeature supports passing in ClientCertificate
xljiulangNov 17, 2024
4c55368
Add support for MqttPacketInspector
xljiulangNov 17, 2024
34a4db2
Add route syntax for pattern parameter.
xljiulangNov 17, 2024
6dc18e1
Add KestrelServerOptions.ListenMqtt() extensions.
xljiulangNov 17, 2024
67dfda4
Optimize the implementation of ListenMqtt.
xljiulangNov 17, 2024
5813a13
Adapt MqttServerTlsTcpEndpointOptions to HttpsConnectionAdapterOptions
xljiulangNov 17, 2024
7628614
Compatible with the default server certificate.
xljiulangNov 17, 2024
7d8562a
Supports both MQTT and MQTT over WebSocket on a ConnectionContext.
xljiulangNov 18, 2024
1bd5949
MqttProtocols adds WebSocket item.
xljiulangNov 18, 2024
c4d9a22
Make sure services.AddMqttServer() has been called before operating M…
xljiulangNov 18, 2024
62313c8
Simplify MqttConnectionMiddleware
xljiulangNov 18, 2024
e087acb
Improve the compatibility of wss connections.
xljiulangNov 18, 2024
db4614c
Update UnixSocket sample.
xljiulangNov 18, 2024
acf8ed7
Update benchmark
xljiulangNov 18, 2024
457dcc1
Enhanced IOptions of MQTT ServiceOptions
xljiulangNov 19, 2024
358c2c0
add IMqttServerBuilder.ConfigureMqttSocketTransport extension.
xljiulangNov 19, 2024
02778aa
Simplifying MqttOptionsFactory
xljiulangNov 19, 2024
b46b357
Optimizing MqttChannel.SendPacketAsync
xljiulangNov 19, 2024
38eb1c3
Check buffer IsEmpty.
xljiulangNov 20, 2024
f953d6d
Merge branch 'dotnet:master' into master
xljiulangNov 30, 2024
ef838f8
Register MqttClientFactory as a service.
xljiulangNov 30, 2024
fcad255
Merge branch 'dotnet:master' into master
xljiulangDec 1, 2024
72b42d5
MqttOptionsFactory.Build() -> MqttOptionsFactory.CreateOptions()
xljiulangDec 2, 2024
b40c8a1
Add MqttBufferWriterPool
xljiulangDec 2, 2024
4305ad7
Merge branch 'dotnet:master' into master
xljiulangDec 2, 2024
cb68a13
Merged from the master branch.
xljiulangDec 2, 2024
a2c014f
Adapt the RemoteEndPoint property.
xljiulangDec 2, 2024
dad4faa
Add MqttBufferWriterPoolOptions
xljiulangDec 3, 2024
6f60eae
Add more conditions to the pool of MqttBufferWriterPoolOptions.
xljiulangDec 3, 2024
cc64f95
Merge branch 'main'
xljiulangDec 4, 2024
54f0b4d
MqttBufferWriterPool: Implementing the IReadOnlyCollection interface.
xljiulangDec 4, 2024
ee4de82
ConfigureAwait(false)
xljiulangDec 4, 2024
b708344
MqttChannel: adapt AllowPacketFragmentation option.
xljiulangDec 4, 2024
13e8190
Fixed the issue that GetRemoteEndPoint did not use the remoteEndPoint…
xljiulangDec 4, 2024
4bfd77d
Add some unit tests.
xljiulangDec 4, 2024
9d9dd44
Add more unit test.
xljiulangDec 4, 2024
8b7c411
MqttBufferWriterPoolOptions: Renaming properties.
xljiulangDec 4, 2024
8a3624d
Rename and update benchmark.
xljiulangDec 5, 2024
06f03cb
Add AspNetCoreTestEnvironment to test environments.
xljiulangDec 6, 2024
146b161
CreateTestEnvironment -> CreateMQTTnetTestEnvironment
xljiulangDec 6, 2024
83148ca
Remove Google's connection test to avoid Google being blocked by SNI …
xljiulangDec 6, 2024
41af5c5
AspNetCoreTestEnvironment: Adapt logger.
xljiulangDec 6, 2024
f94e17a
wait with timeout.
xljiulangDec 6, 2024
efcd6ab
AspNetCoreTestEnvironment: Adjust all configurations to be consistent…
xljiulangDec 6, 2024
b035659
MqttChannel: Exception handling remains consistent with MqttChannelAd…
xljiulangDec 6, 2024
6171c81
CrossPlatformSocket_Tests: create a localhost web server for remote h…
xljiulangDec 6, 2024
9a7a8bd
Server-side adaptation of AllowPacketFragmentation options.
xljiulangDec 7, 2024
e01e5f3
Merge implementation of IsAllowPacketFragmentation.
xljiulangDec 8, 2024
bffe065
Added UseLogger overloaded method and renamed an internal method.
xljiulangDec 8, 2024
ca5d13d
Add some extension methods to IMqttChannelAdapter.
xljiulangDec 8, 2024
8ceba5f
Add IAspNetCoreMqttChannel and remove IAspNetCoreMqttChannelAdapter;
xljiulangDec 9, 2024
b65c176
MapMqtt: Restricted to WebSocket transport protocol.
xljiulangDec 9, 2024
51fb185
Adapt MqttServerTcpEndpointBaseOptions to the Socket accepted by kest…
xljiulangDec 9, 2024
79f4f68
SocketOptionName.ReuseAddress can only be used for listening Socket s…
xljiulangDec 9, 2024
7139431
Accurately detect the DualMode value of listenSocket.
xljiulangDec 9, 2024
5c6e128
Merge branch 'dotnet:master' into master
xljiulangDec 12, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
PrevPrevious commit
NextNext commit
AspNetCoreTestEnvironment: Adjust all configurations to be consistent…
… with TestEnvironment.
  • Loading branch information
@xljiulang
xljiulang committedDec 6, 2024
commitefcd6ab11f9b292eff94ef5083653568a34c733c
20 changes: 16 additions & 4 deletionsSource/MQTTnet.Tests/MQTTv5/Server_Tests.cs
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -182,9 +182,21 @@ public async Task Reconnect_with_different_SessionExpiryInterval()
}

[TestMethod]
public async Task Disconnect_with_Reason()
public async Task Disconnect_with_Reason_MQTTnet()
{
using var testEnvironments = CreateMQTTnetTestEnvironment();
await Disconnect_with_Reason(testEnvironments);
}

[TestMethod]
public async Task Disconnect_with_Reason_AspNetCore()
{
using var testEnvironments = CreateAspNetCoreTestEnvironment();
await Disconnect_with_Reason(testEnvironments);
}

private async Task Disconnect_with_Reason(TestEnvironmentCollection testEnvironments)
{
using var testEnvironments = CreateMixedTestEnvironment();
foreach (var testEnvironment in testEnvironments)
{
var disconnectReasonTaskSource = new TaskCompletionSource<MqttClientDisconnectReason>();
Expand All@@ -211,14 +223,14 @@ public async Task Disconnect_with_Reason()

// Test client should be connected now

var testClientId = await testClientIdTaskSource.Task.WaitAsync(TimeSpan.FromSeconds(10d)); ;
var testClientId = await testClientIdTaskSource.Task.WaitAsync(TimeSpan.FromSeconds(10d));
Assert.IsTrue(testClientId != null);

// Have the server disconnect the client with AdministrativeAction reason

await testEnvironment.Server.DisconnectClientAsync(testClientId, MqttDisconnectReasonCode.AdministrativeAction);

var disconnectReason = await disconnectReasonTaskSource.Task.WaitAsync(TimeSpan.FromSeconds(10d)); ;
var disconnectReason = await disconnectReasonTaskSource.Task.WaitAsync(TimeSpan.FromSeconds(10d));
// The reason should be returned to the client in the DISCONNECT packet

Assert.AreEqual(MqttClientDisconnectReason.AdministrativeAction, disconnectReason);
Expand Down
144 changes: 63 additions & 81 deletionsSource/MQTTnet.Tests/Mockups/AspNetCoreTestEnvironment.cs
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,6 +10,8 @@
using MQTTnet.AspNetCore;
using MQTTnet.Formatter;
using MQTTnet.Internal;
using MQTTnet.LowLevelClient;
using MQTTnet.Protocol;
using MQTTnet.Server;
using System;
using System.Linq;
Expand All@@ -32,100 +34,62 @@ public AspNetCoreTestEnvironment(TestContext testContext, MqttProtocolVersion pr
{
}

public override IMqttClientCreateClient()
protected override IMqttClientCreateClientCore()
{
var services = new ServiceCollection();
var clientBuilder = services.AddMqttClient();
UseLogger(clientBuilder);

var s = services.BuildServiceProvider();
var client = s.GetRequiredService<IMqttClientFactory>().CreateMqttClient();

client.ConnectingAsync += e =>
{
if (TestContext != null)
{
var clientOptions = e.ClientOptions;
var existingClientId = clientOptions.ClientId;
if (existingClientId != null && !existingClientId.StartsWith(TestContext.TestName))
{
clientOptions.ClientId = TestContext.TestName + "_" + existingClientId;
}
}

return CompletedTask.Instance;
};
return CreateClientFactory().CreateMqttClient();
}

lock (_clients)
{
_clients.Add(client);
}
protected override ILowLevelMqttClient CreateLowLevelClientCore()
{
return CreateClientFactory().CreateLowLevelMqttClient();
}

return client;
private IMqttClientFactory CreateClientFactory()
{
var services = new ServiceCollection();
var clientBuilder = services.AddMqttClient();
UseMqttLogger(clientBuilder, "[CLIENT]=>");
return services.BuildServiceProvider().GetRequiredService<IMqttClientFactory>();
}

public override MqttServer CreateServer(MqttServerOptions options)
{
throw new NotSupportedException("Can not create MqttServer in AspNetCoreTestEnvironment.");
}

public overrideasyncTask<MqttServer> StartServer(Action<MqttServerOptionsBuilder> configure)
public override Task<MqttServer> StartServer(Action<MqttServerOptionsBuilder> configure)
{
if (Server != null)
{
throw new InvalidOperationException("Server already started.");
}

var appBuilder = WebApplication.CreateBuilder();

var serverBuilder = appBuilder.Services.AddMqttServer(optionsBuilder =>
{
optionsBuilder.WithDefaultEndpoint();
optionsBuilder.WithDefaultEndpointPort(ServerPort);
optionsBuilder.WithMaxPendingMessagesPerClient(int.MaxValue);
}).ConfigureMqttServer(configure, o =>
{
if (o.DefaultEndpointOptions.Port == 0)
{
var serverPort = GetServerPort();
o.DefaultEndpointOptions.Port = serverPort;
ServerPort = serverPort;
}
});

UseLogger(serverBuilder);

appBuilder.WebHost.UseKestrel(k => k.ListenMqtt());
appBuilder.Host.ConfigureHostOptions(h => h.ShutdownTimeout = TimeSpan.FromMilliseconds(500d));

_app = appBuilder.Build();
await _app.StartAsync();
var optionsBuilder = new MqttServerOptionsBuilder();
configure?.Invoke(optionsBuilder);
return StartServer(optionsBuilder);
}

Server = _app.Services.GetRequiredService<MqttServer>();
return Server;
public override Task<MqttServer> StartServer(MqttServerOptionsBuilder optionsBuilder)
{
optionsBuilder.WithDefaultEndpoint();
optionsBuilder.WithMaxPendingMessagesPerClient(int.MaxValue);
var serverOptions = optionsBuilder.Build();
return StartServer(serverOptions);
}

public overrideasync Task<MqttServer> StartServer(MqttServerOptionsBuilder optionsBuilder)
privateasync Task<MqttServer> StartServer(MqttServerOptions serverOptions)
{
if (Server != null)
{
throw new InvalidOperationException("Server already started.");
}

if (ServerPort == 0)
if (serverOptions.DefaultEndpointOptions.Port == 0)
{
ServerPort = GetServerPort();
var serverPort = ServerPort > 0 ? ServerPort : GetServerPort();
serverOptions.DefaultEndpointOptions.Port = serverPort;
}

optionsBuilder.WithDefaultEndpoint();
optionsBuilder.WithDefaultEndpointPort(ServerPort);
optionsBuilder.WithMaxPendingMessagesPerClient(int.MaxValue);

var appBuilder = WebApplication.CreateBuilder();
appBuilder.Services.AddSingleton(optionsBuilder.Build());
var serverBuilder = appBuilder.Services.AddMqttServer();
appBuilder.Services.AddSingleton(serverOptions);

UseLogger(serverBuilder);
var serverBuilder = appBuilder.Services.AddMqttServer();
UseMqttLogger(serverBuilder, "[SERVER]=>");

appBuilder.WebHost.UseKestrel(k => k.ListenMqtt());
appBuilder.Host.ConfigureHostOptions(h => h.ShutdownTimeout = TimeSpan.FromMilliseconds(500d));
Expand All@@ -134,20 +98,27 @@ public override async Task<MqttServer> StartServer(MqttServerOptionsBuilder opti
await _app.StartAsync();

Server = _app.Services.GetRequiredService<MqttServer>();
return Server;
}
ServerPort = serverOptions.DefaultEndpointOptions.Port;

public override void Dispose()
{
if (_app != null)
Server.ValidatingConnectionAsync += e =>
{
_app.StopAsync().ConfigureAwait(false).GetAwaiter().GetResult();
_app.DisposeAsync().ConfigureAwait(false).GetAwaiter().GetResult();
_app = null;
}
base.Dispose();
if (TestContext != null)
{
// Null is used when the client id is assigned from the server!
if (!string.IsNullOrEmpty(e.ClientId) && !e.ClientId.StartsWith(TestContext.TestName))
{
TrackException(new InvalidOperationException($"Invalid client ID used ({e.ClientId}). It must start with UnitTest name."));
e.ReasonCode = MqttConnectReasonCode.ClientIdentifierNotValid;
}
}

return CompletedTask.Instance;
};

return Server;
}


private static int GetServerPort()
{
var listeners = IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners();
Expand All@@ -161,16 +132,27 @@ private static int GetServerPort()
return port;
}

private voidUseLogger(IMqttBuilder builder)
private voidUseMqttLogger(IMqttBuilder builder, string categoryNamePrefix)
{
if (EnableLogger)
{
builder.UseAspNetCoreMqttNetLogger();
builder.UseAspNetCoreMqttNetLogger(l => l.CategoryNamePrefix = categoryNamePrefix);
}
else
{
builder.UseMqttNetNullLogger();
}
}

public override void Dispose()
{
base.Dispose();
if (_app != null)
{
_app.StopAsync().ConfigureAwait(false).GetAwaiter().GetResult();
_app.DisposeAsync().ConfigureAwait(false).GetAwaiter().GetResult();
_app = null;
}
}
}
}
22 changes: 16 additions & 6 deletionsSource/MQTTnet.Tests/Mockups/TestEnvironment.cs
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,7 @@ public class TestEnvironment : IDisposable
{
bool _disposed = false;
readonly List<string> _clientErrors = new();
protectedreadonly List<IMqttClient> _clients = new();
readonly List<IMqttClient> _clients = new();
readonly List<Exception> _exceptions = new();
readonly List<ILowLevelMqttClient> _lowLevelClients = new();
readonly MqttProtocolVersion _protocolVersion;
Expand DownExpand Up@@ -196,11 +196,9 @@ public TestApplicationMessageReceivedHandler CreateApplicationMessageHandler(IMq
return new TestApplicationMessageReceivedHandler(mqttClient);
}

publicvirtualIMqttClient CreateClient()
public IMqttClient CreateClient()
{
var logger = EnableLogger ? (IMqttNetLogger)ClientLogger : MqttNetNullLogger.Instance;

var client = ClientFactory.CreateMqttClient(logger);
var client = CreateClientCore();

client.ConnectingAsync += e =>
{
Expand All@@ -225,6 +223,12 @@ public virtual IMqttClient CreateClient()
return client;
}

protected virtual IMqttClient CreateClientCore()
{
var logger = EnableLogger ? (IMqttNetLogger)ClientLogger : MqttNetNullLogger.Instance;
return ClientFactory.CreateMqttClient(logger);
}

public MqttClientOptions CreateDefaultClientOptions()
{
return CreateDefaultClientOptionsBuilder().Build();
Expand All@@ -240,7 +244,7 @@ public MqttClientOptionsBuilder CreateDefaultClientOptionsBuilder()

public ILowLevelMqttClient CreateLowLevelClient()
{
var client =ClientFactory.CreateLowLevelMqttClient(ClientLogger);
var client =CreateLowLevelClientCore();

lock (_lowLevelClients)
{
Expand All@@ -250,6 +254,12 @@ public ILowLevelMqttClient CreateLowLevelClient()
return client;
}

protected virtual ILowLevelMqttClient CreateLowLevelClientCore()
{
return ClientFactory.CreateLowLevelMqttClient(ClientLogger);
}


public virtual MqttServer CreateServer(MqttServerOptions options)
{
if (Server != null)
Expand Down
14 changes: 7 additions & 7 deletionsSource/MQTTnet.Tests/Server/Events_Tests.cs
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,7 +33,7 @@ public async Task Fire_Client_Connected_Event()

await testEnvironment.ConnectClient(o => o.WithCredentials("TheUser"));

var eventArgs = await eventArgsTaskSource.Task.WaitAsync(TimeSpan.FromSeconds(10d)); ;
var eventArgs = await eventArgsTaskSource.Task.WaitAsync(TimeSpan.FromSeconds(10d));

Assert.IsNotNull(eventArgs);

Expand DownExpand Up@@ -63,7 +63,7 @@ public async Task Fire_Client_Disconnected_Event()
var client = await testEnvironment.ConnectClient(o => o.WithCredentials("TheUser"));
await client.DisconnectAsync();

var eventArgs = await eventArgsTaskSource.Task.WaitAsync(TimeSpan.FromSeconds(10d)); ;
var eventArgs = await eventArgsTaskSource.Task.WaitAsync(TimeSpan.FromSeconds(10d));

Assert.IsNotNull(eventArgs);

Expand DownExpand Up@@ -92,7 +92,7 @@ public async Task Fire_Client_Subscribed_Event()
var client = await testEnvironment.ConnectClient();
await client.SubscribeAsync("The/Topic", MqttQualityOfServiceLevel.AtLeastOnce);

var eventArgs = await eventArgsTaskSource.Task.WaitAsync(TimeSpan.FromSeconds(10d)); ;
var eventArgs = await eventArgsTaskSource.Task.WaitAsync(TimeSpan.FromSeconds(10d));

Assert.IsNotNull(eventArgs);

Expand DownExpand Up@@ -121,7 +121,7 @@ public async Task Fire_Client_Unsubscribed_Event()
var client = await testEnvironment.ConnectClient();
await client.UnsubscribeAsync("The/Topic");

var eventArgs = await eventArgsTaskSource.Task.WaitAsync(TimeSpan.FromSeconds(10d)); ;
var eventArgs = await eventArgsTaskSource.Task.WaitAsync(TimeSpan.FromSeconds(10d));

Assert.IsNotNull(eventArgs);

Expand DownExpand Up@@ -149,7 +149,7 @@ public async Task Fire_Application_Message_Received_Event()
var client = await testEnvironment.ConnectClient();
await client.PublishStringAsync("The_Topic", "The_Payload");

var eventArgs = await eventArgsTaskSource.Task.WaitAsync(TimeSpan.FromSeconds(10d)); ;
var eventArgs = await eventArgsTaskSource.Task.WaitAsync(TimeSpan.FromSeconds(10d));

Assert.IsNotNull(eventArgs);

Expand All@@ -176,7 +176,7 @@ public async Task Fire_Started_Event()

await server.StartAsync();

var eventArgs = await eventArgsTaskSource.Task.WaitAsync(TimeSpan.FromSeconds(10d)); ;
var eventArgs = await eventArgsTaskSource.Task.WaitAsync(TimeSpan.FromSeconds(10d));

Assert.IsNotNull(eventArgs);
}
Expand All@@ -199,7 +199,7 @@ public async Task Fire_Stopped_Event()

await server.StopAsync();

var eventArgs = await eventArgsTaskSource.Task.WaitAsync(TimeSpan.FromSeconds(10d)); ;
var eventArgs = await eventArgsTaskSource.Task.WaitAsync(TimeSpan.FromSeconds(10d));

Assert.IsNotNull(eventArgs);
}
Expand Down
Loading

[8]ページ先頭

©2009-2025 Movatter.jp