From b74fd644ffb577690fc0c3e0e0dab12d035b3803 Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Tue, 30 Jul 2024 20:22:43 +0200 Subject: [PATCH] Added thread-safe random class --- .../Components/AssistantBase.razor.cs | 3 +- .../Components/Blocks/Workspaces.razor.cs | 2 +- .../Components/Pages/Chat.razor.cs | 2 +- app/MindWork AI Studio/Program.cs | 2 +- .../Tools/ThreadSafeRandom.cs | 88 +++++++++++++++++++ 5 files changed, 93 insertions(+), 4 deletions(-) create mode 100644 app/MindWork AI Studio/Tools/ThreadSafeRandom.cs diff --git a/app/MindWork AI Studio/Components/AssistantBase.razor.cs b/app/MindWork AI Studio/Components/AssistantBase.razor.cs index a2e46eac..5ef9e707 100644 --- a/app/MindWork AI Studio/Components/AssistantBase.razor.cs +++ b/app/MindWork AI Studio/Components/AssistantBase.razor.cs @@ -1,6 +1,7 @@ using AIStudio.Chat; using AIStudio.Provider; using AIStudio.Settings; +using AIStudio.Tools; using Microsoft.AspNetCore.Components; @@ -15,7 +16,7 @@ public abstract partial class AssistantBase : ComponentBase protected IJSRuntime JsRuntime { get; init; } = null!; [Inject] - protected Random RNG { get; set; } = null!; + protected ThreadSafeRandom RNG { get; init; } = null!; protected abstract string Title { get; } diff --git a/app/MindWork AI Studio/Components/Blocks/Workspaces.razor.cs b/app/MindWork AI Studio/Components/Blocks/Workspaces.razor.cs index 02ef0417..6149405d 100644 --- a/app/MindWork AI Studio/Components/Blocks/Workspaces.razor.cs +++ b/app/MindWork AI Studio/Components/Blocks/Workspaces.razor.cs @@ -22,7 +22,7 @@ public partial class Workspaces : ComponentBase private IDialogService DialogService { get; set; } = null!; [Inject] - public Random RNG { get; set; } = null!; + private ThreadSafeRandom RNG { get; init; } = null!; [Parameter] public ChatThread? CurrentChatThread { get; set; } diff --git a/app/MindWork AI Studio/Components/Pages/Chat.razor.cs b/app/MindWork AI Studio/Components/Pages/Chat.razor.cs index d880982e..05eae509 100644 --- a/app/MindWork AI Studio/Components/Pages/Chat.razor.cs +++ b/app/MindWork AI Studio/Components/Pages/Chat.razor.cs @@ -25,7 +25,7 @@ public partial class Chat : MSGComponentBase, IAsyncDisposable public IJSRuntime JsRuntime { get; init; } = null!; [Inject] - public Random RNG { get; set; } = null!; + private ThreadSafeRandom RNG { get; init; } = null!; [Inject] public IDialogService DialogService { get; set; } = null!; diff --git a/app/MindWork AI Studio/Program.cs b/app/MindWork AI Studio/Program.cs index 1ca814e9..9c14e437 100644 --- a/app/MindWork AI Studio/Program.cs +++ b/app/MindWork AI Studio/Program.cs @@ -29,7 +29,7 @@ builder.Services.AddSingleton(MessageBus.INSTANCE); builder.Services.AddSingleton(); builder.Services.AddMudMarkdownClipboardService(); builder.Services.AddSingleton(); -builder.Services.AddSingleton(); +builder.Services.AddSingleton(); builder.Services.AddHostedService(); builder.Services.AddHostedService(); builder.Services.AddRazorComponents() diff --git a/app/MindWork AI Studio/Tools/ThreadSafeRandom.cs b/app/MindWork AI Studio/Tools/ThreadSafeRandom.cs new file mode 100644 index 00000000..27bb61ad --- /dev/null +++ b/app/MindWork AI Studio/Tools/ThreadSafeRandom.cs @@ -0,0 +1,88 @@ +namespace AIStudio.Tools; + +/// +public sealed class ThreadSafeRandom : Random +{ + private static readonly object LOCK = new(); + + #region Overrides of Random + + /// + public override int Next() + { + lock (LOCK) + return base.Next(); + } + + /// + public override int Next(int maxValue) + { + lock (LOCK) + return base.Next(maxValue); + } + + /// + public override int Next(int minValue, int maxValue) + { + lock (LOCK) + return base.Next(minValue, maxValue); + } + + /// + public override void NextBytes(byte[] buffer) + { + lock (LOCK) + base.NextBytes(buffer); + } + + /// + public override void NextBytes(Span buffer) + { + lock (LOCK) + base.NextBytes(buffer); + } + + /// + public override double NextDouble() + { + lock (LOCK) + return base.NextDouble(); + } + + /// + public override long NextInt64() + { + lock (LOCK) + return base.NextInt64(); + } + + /// + public override long NextInt64(long maxValue) + { + lock (LOCK) + return base.NextInt64(maxValue); + } + + /// + public override long NextInt64(long minValue, long maxValue) + { + lock (LOCK) + return base.NextInt64(minValue, maxValue); + } + + /// + public override float NextSingle() + { + lock (LOCK) + return base.NextSingle(); + } + + /// + protected override double Sample() + { + lock (LOCK) + return base.Sample(); + } + + #endregion +} \ No newline at end of file