Merge pull request #72053 from raulsntos/dotnet/sync-context-dispose

C#: Implement disposable pattern and seal `GodotSynchronizationContext` class and related
This commit is contained in:
Rémi Verschelde 2023-01-26 23:41:52 +01:00
commit 0f840cb214
No known key found for this signature in database
GPG Key ID: C3336907360768E1
3 changed files with 18 additions and 5 deletions

View File

@ -9,7 +9,10 @@ namespace Godot
internal static GodotTaskScheduler DefaultGodotTaskScheduler;
internal static void InitializeDefaultGodotTaskScheduler()
=> DefaultGodotTaskScheduler = new GodotTaskScheduler();
{
DefaultGodotTaskScheduler?.Dispose();
DefaultGodotTaskScheduler = new GodotTaskScheduler();
}
public static GodotSynchronizationContext SynchronizationContext => DefaultGodotTaskScheduler.Context;
}

View File

@ -1,13 +1,13 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading;
namespace Godot
{
public class GodotSynchronizationContext : SynchronizationContext
public sealed class GodotSynchronizationContext : SynchronizationContext, IDisposable
{
private readonly BlockingCollection<KeyValuePair<SendOrPostCallback, object>> _queue =
new BlockingCollection<KeyValuePair<SendOrPostCallback, object>>();
private readonly BlockingCollection<KeyValuePair<SendOrPostCallback, object>> _queue = new();
public override void Post(SendOrPostCallback d, object state)
{
@ -24,5 +24,10 @@ namespace Godot
workItem.Key(workItem.Value);
}
}
public void Dispose()
{
_queue.Dispose();
}
}
}

View File

@ -10,7 +10,7 @@ namespace Godot
/// GodotTaskScheduler contains a linked list of tasks to perform as a queue. Methods
/// within the class are used to control the queue and perform the contained tasks.
/// </summary>
public class GodotTaskScheduler : TaskScheduler
public sealed class GodotTaskScheduler : TaskScheduler, IDisposable
{
/// <summary>
/// The current synchronization context.
@ -108,5 +108,10 @@ namespace Godot
}
}
}
public void Dispose()
{
Context.Dispose();
}
}
}