fix: dispose observables and completion sources from Dispose method

This commit is contained in:
Oliver Booth 2023-05-08 15:53:09 +01:00
parent 1f761668f7
commit 32056224d8
No known key found for this signature in database
GPG Key ID: 20BEB9DC87961025
1 changed files with 75 additions and 0 deletions

View File

@ -200,6 +200,13 @@ public sealed partial class VirtualParadiseClient : IDisposable
{ {
ReleaseUnmanagedResources(); ReleaseUnmanagedResources();
GC.SuppressFinalize(this); GC.SuppressFinalize(this);
DisposeCompletionSources();
DisposeObservables();
_worlds.Clear();
_avatars.Clear();
_users.Clear();
} }
/// <summary> /// <summary>
@ -678,6 +685,74 @@ public sealed partial class VirtualParadiseClient : IDisposable
return taskCompletionSource; return taskCompletionSource;
} }
private void DisposeCompletionSources()
{
_connectCompletionSource?.TrySetCanceled();
_connectCompletionSource = null;
_enterCompletionSource?.TrySetCanceled();
_enterCompletionSource = null;
_loginCompletionSource?.TrySetCanceled();
_loginCompletionSource = null;
_worldSettingsCompletionSource.TrySetCanceled();
_worldSettingsCompletionSource = null!;
foreach (KeyValuePair<int, TaskCompletionSource<ReasonCode>> pair in _inviteCompletionSources)
{
pair.Value.TrySetCanceled();
}
foreach (KeyValuePair<int, TaskCompletionSource<ReasonCode>> pair in _joinCompletionSources)
{
pair.Value.TrySetCanceled();
}
foreach (KeyValuePair<int, TaskCompletionSource<(ReasonCode, VirtualParadiseObject?)>> pair in _objectCompletionSources)
{
pair.Value.TrySetCanceled();
}
foreach (KeyValuePair<int, TaskCompletionSource<ReasonCode>> pair in _objectUpdates)
{
pair.Value.TrySetCanceled();
}
foreach (KeyValuePair<int, TaskCompletionSource<VirtualParadiseUser>> pair in _usersCompletionSources)
{
pair.Value.TrySetCanceled();
}
_joinCompletionSources.Clear();
_inviteCompletionSources.Clear();
_objectCompletionSources.Clear();
_objectUpdates.Clear();
_usersCompletionSources.Clear();
}
private void DisposeObservables()
{
_avatarClicked.Dispose();
_avatarJoined.Dispose();
_avatarLeft.Dispose();
_avatarMoved.Dispose();
_avatarTypeChanged.Dispose();
_objectBump.Dispose();
_objectClicked.Dispose();
_objectCreated.Dispose();
_objectDeleted.Dispose();
_objectUpdates.Clear();
_inviteRequestReceived.Dispose();
_joinRequestReceived.Dispose();
_teleported.Dispose();
_uriReceived.Dispose();
_universeServerDisconnected.Dispose();
_worldServerDisconnected.Dispose();
}
private void ReleaseUnmanagedResources() private void ReleaseUnmanagedResources()
{ {
_ = vp_destroy(NativeInstanceHandle); _ = vp_destroy(NativeInstanceHandle);