mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-01-15 23:03:55 +01:00
* 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>
85 lines
2.3 KiB
C#
85 lines
2.3 KiB
C#
// 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);
|
|
}
|
|
}
|
|
} |