mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-03-23 18:01:47 +01:00
Create WireMock.Net.MimePart project (#1300)
* Create WireMock.Net.MimePart project * . * REFACTOR * ILRepack * -- * ... * x * x * . * fix * public class MimePartMatcher * shared * min * . * <!--<DelaySign>true</DelaySign>--> * Update README.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
85
src/WireMock.Net.Minimal/Models/BlockingQueue.cs
Normal file
85
src/WireMock.Net.Minimal/Models/BlockingQueue.cs
Normal file
@@ -0,0 +1,85 @@
|
||||
// Copyright © WireMock.Net
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Threading;
|
||||
|
||||
namespace WireMock.Models;
|
||||
|
||||
/// <inheritdoc />
|
||||
internal class BlockingQueue<T>(TimeSpan? readTimeout = null) : IBlockingQueue<T>
|
||||
{
|
||||
private readonly TimeSpan _readTimeout = readTimeout ?? TimeSpan.FromHours(1);
|
||||
private readonly Queue<T?> _queue = new();
|
||||
private readonly object _lockObject = new();
|
||||
|
||||
private bool _isClosed;
|
||||
|
||||
/// <summary>
|
||||
/// Writes an item to the queue and signals that an item is available.
|
||||
/// </summary>
|
||||
/// <param name="item">The item to be added to the queue.</param>
|
||||
public void Write(T item)
|
||||
{
|
||||
lock (_lockObject)
|
||||
{
|
||||
if (_isClosed)
|
||||
{
|
||||
throw new InvalidOperationException("Cannot write to a closed queue.");
|
||||
}
|
||||
|
||||
_queue.Enqueue(item);
|
||||
|
||||
// Signal that an item is available
|
||||
Monitor.Pulse(_lockObject);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Tries to read an item from the queue.
|
||||
/// - waits until an item is available
|
||||
/// - or the timeout occurs
|
||||
/// - or queue is closed
|
||||
/// </summary>
|
||||
/// <param name="item">The item read from the queue, or default if the timeout occurs.</param>
|
||||
/// <returns>True if an item was successfully read; otherwise, false.</returns>
|
||||
public bool TryRead([NotNullWhen(true)] out T? item)
|
||||
{
|
||||
lock (_lockObject)
|
||||
{
|
||||
// Wait until an item is available or timeout occurs
|
||||
while (_queue.Count == 0 && !_isClosed)
|
||||
{
|
||||
// Wait with timeout
|
||||
if (!Monitor.Wait(_lockObject, _readTimeout))
|
||||
{
|
||||
item = default;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// After waiting, check if we have items
|
||||
if (_queue.Count == 0)
|
||||
{
|
||||
item = default;
|
||||
return false;
|
||||
}
|
||||
|
||||
item = _queue.Dequeue();
|
||||
return item != null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Closes the queue and signals all waiting threads.
|
||||
/// </summary>
|
||||
public void Close()
|
||||
{
|
||||
lock (_lockObject)
|
||||
{
|
||||
_isClosed = true;
|
||||
Monitor.PulseAll(_lockObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user