Skip to content

Commit de95d35

Browse files
committed
Refactor Timeout
Bump v0.0.29
1 parent 8600cb9 commit de95d35

File tree

4 files changed

+47
-35
lines changed

4 files changed

+47
-35
lines changed

ArtNetSharp/ArtNetSharp.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<PropertyGroup>
33
<TargetFrameworks>netstandard2.0;net6.0;net7.0;net8.0</TargetFrameworks>
44
<PackageLicenseFile>LICENSE</PackageLicenseFile>
5-
<Version>0.0.28</Version>
5+
<Version>0.0.29</Version>
66
<RepositoryUrl>https://github.com/DMXControl/ArtNetSharp</RepositoryUrl>
77
<PackageProjectUrl>$(RepositoryUrl)</PackageProjectUrl>
88
<PackageTags>RDM; ArtNet; E1.20; E1.33; E1.37-1; E1.37-2; E1.37-7</PackageTags>

ArtNetSharp/Communication/AbstractInstance.cs

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -252,9 +252,9 @@ public void Dispose()
252252
public event EventHandler<ResponderRDMMessageReceivedEventArgs> ResponderRDMMessageReceived;
253253
public event EventHandler<ControllerRDMMessageReceivedEventArgs> ControllerRDMMessageReceived;
254254

255-
private static readonly SendPollThreadBag sendPollThreadBag = new SendPollThreadBag();
255+
internal static readonly SendPollThreadBag sendPollThreadBag = new SendPollThreadBag();
256256

257-
private class SendPollThreadBag
257+
internal class SendPollThreadBag
258258
{
259259
private readonly Thread sendPollThread;
260260
public EventHandler SendArtPollEvent;
@@ -826,23 +826,6 @@ void add(RemoteClient rc)
826826
}
827827
}
828828
catch (Exception ex) { Logger.LogError(ex); }
829-
830-
var timoutedClients = RemoteClients.Where(p => p.Timouted());
831-
if (timoutedClients.Count() != 0)
832-
{
833-
timoutedClients = timoutedClients.ToList();
834-
foreach (var rc in timoutedClients)
835-
{
836-
837-
if (remoteClients.TryRemove(rc.ID, out RemoteClient removed))
838-
remoteClientsTimeouted.TryAdd(removed.ID, removed);
839-
if (removed != null)
840-
{
841-
Logger.LogInformation($"Timeout: {removed.ID} ({(DateTime.UtcNow - rc.LastSeen).TotalMilliseconds}ms)");
842-
Task.Run(() => RemoteClientTimedOut?.InvokeFailSafe(this, removed));
843-
}
844-
}
845-
}
846829
RemoteClients = remoteClients.Select(p => p.Value).ToList().AsReadOnly();
847830
}
848831
private void processArtDMX(ArtDMX artDMX, IPv4Address sourceIp)
@@ -1281,6 +1264,28 @@ private async void TimerSendPoll_Elapsed(object sender, EventArgs e)
12811264
return;
12821265

12831266
await triggerSendArtPoll();
1267+
await Task.Delay(3000);
1268+
1269+
var timoutedClients = remoteClients.Where(p => p.Value.Timouted());
1270+
if (timoutedClients.Count() != 0)
1271+
{
1272+
timoutedClients = timoutedClients.ToList();
1273+
foreach (var rc in timoutedClients)
1274+
{
1275+
1276+
if (remoteClients.TryRemove(rc.Key, out RemoteClient removed))
1277+
remoteClientsTimeouted.TryAdd(removed.ID, removed);
1278+
else
1279+
Logger.LogWarning($"Can't remove RemoteClient from ConcurrentDictionary");
1280+
1281+
if (removed != null)
1282+
{
1283+
Logger.LogInformation($"Timeout: {removed.ID} ({(DateTime.UtcNow - rc.Value.LastSeen).TotalMilliseconds}ms)");
1284+
_ = Task.Run(() => RemoteClientTimedOut?.InvokeFailSafe(this, removed));
1285+
}
1286+
}
1287+
}
1288+
RemoteClients = remoteClients.Select(p => p.Value).ToList().AsReadOnly();
12841289
}
12851290

12861291
void IDisposable.Dispose()

ArtNetSharp/Communication/RemoteClient.cs

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ private set
8282
}
8383
internal bool Timouted() // Spec 1.4dd page 12, doubled to allow one lost reply (6s is allowad, for some delay i add 2500 ms)
8484
{
85-
var now = DateTime.UtcNow.AddSeconds(-9.5);
85+
var now = DateTime.UtcNow.AddSeconds(-3);
8686
return LastSeen <= now;
8787
}
8888

@@ -258,6 +258,7 @@ internal AbstractInstance Instance
258258

259259
public RemoteClient(in ArtPollReply artPollReply)
260260
{
261+
AbstractInstance.sendPollThreadBag.SendArtPollEvent += OnSendArtPoll;
261262
seen();
262263
ID = getIDOf(artPollReply);
263264
MacAddress = artPollReply.MAC;
@@ -266,6 +267,23 @@ public RemoteClient(in ArtPollReply artPollReply)
266267
processArtPollReply(artPollReply);
267268
seen();
268269
}
270+
private async void OnSendArtPoll(object sender, EventArgs e)
271+
{
272+
await Task.Delay(3000);
273+
274+
var timoutedPorts = ports.Where(p => p.Value.Timouted());
275+
if (timoutedPorts.Count() != 0)
276+
{
277+
timoutedPorts = timoutedPorts.ToList();
278+
foreach (var port in timoutedPorts)
279+
{
280+
if (!ports.TryRemove(port.Key, out _))
281+
Logger.LogWarning($"Can't remove RemoteClientPort from ConcurrentDictionary");
282+
_ = Task.Run(() => PortTimedOut?.InvokeFailSafe(this, port));
283+
}
284+
}
285+
Ports = ports.Select(p => p.Value).ToList().AsReadOnly();
286+
}
269287
private void seen()
270288
{
271289
LastSeen = DateTime.UtcNow;
@@ -288,6 +306,7 @@ public void processArtPollReply(ArtPollReply artPollReply)
288306
return;
289307

290308
seen();
309+
List<Task> tasks = new List<Task>();
291310
try
292311
{
293312
for (byte portIndex = 0; portIndex < artPollReply.Ports; portIndex++)
@@ -300,7 +319,7 @@ public void processArtPollReply(ArtPollReply artPollReply)
300319
port = new RemoteClientPort(artPollReply, portIndex);
301320
if (ports.TryAdd(physicalPort, port))
302321
{
303-
Task.Run(() => PortDiscovered?.InvokeFailSafe(this, port));
322+
tasks.Add(Task.Run(() => PortDiscovered?.InvokeFailSafe(this, port)));
304323
port.RDMUIDReceived += Port_RDMUIDReceived;
305324
}
306325
}
@@ -311,18 +330,6 @@ public void processArtPollReply(ArtPollReply artPollReply)
311330
Logger.LogError(ex);
312331
}
313332
seen();
314-
315-
var timoutedPorts = ports.Where(p => p.Value.Timouted());
316-
if (timoutedPorts.Count() != 0)
317-
{
318-
timoutedPorts = timoutedPorts.ToList();
319-
foreach (var port in timoutedPorts)
320-
{
321-
ports.TryRemove(port.Key, out _);
322-
Task.Run(()=>PortTimedOut?.InvokeFailSafe(this, port));
323-
}
324-
}
325-
seen();
326333
Ports = ports.Select(p => p.Value).ToList().AsReadOnly();
327334
}
328335
public async Task processArtDataReply(ArtDataReply artDataReply)

ArtNetSharp/Communication/RemoteClientPort.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ private void seen()
3939
}
4040
internal bool Timouted()// Spec 1.4dd page 12, doubled to allow one lost reply (6s is allowad, for some delay i add 1500 ms)
4141
{
42-
var now = DateTime.UtcNow.AddSeconds(-7.5);
42+
var now = DateTime.UtcNow.AddSeconds(-3);
4343
return LastSeen <= now;
4444
}
4545
public ArtPollReply ArtPollReply { get; private set; }

0 commit comments

Comments
 (0)