Класс многопоточного дозирования


Мне нужно написать класс для пакетного заказа объектах от 3 вызова компонентов, работающих на 3 отдельные темы. В 3 звоню компоненты будем называть дозатора класс В то же время (в пределах секунды друг от друга), но чтобы отрегулировать часы вопросов и ниток чередование, метод должен ждать в течение максимум 5 секунд, после 3 звонков. Если по какой-либо причине только 2 звонка сделать, дозатор следует продолжать после 5-секундный тайм-аут и Партия, что она имеет. В дозатор класс должен появиться синхронизации вызова компонентов.

Я написал класс, и это, кажется, работает, но я в этом деле новичок и буду признателен, если кто-то может посмотреть мой класс.

public sealed class Batcher
{
    private readonly object _syncLock = new object();
    private readonly Timer _timer;
    private bool _timerSet = false;
    private volatile int _callCount = 0;
    private const int ExecuteImmediatelyCallCount = 3;
    private readonly ManualResetEvent _manualResetEvent = new ManualResetEvent(false);
    private readonly List<Order> _orders = new List<Order>();

    public Batcher()
    {
        _timer = new Timer(Batch, null, Timeout.Infinite, Timeout.Infinite);
    }

    public void  TryBatch(IEnumerable<Order> orders)
    {
        lock (_syncLock)
        {
            _orders.AddRange(orders);
            if(!_timerSet)
            {
                _timerSet = true;
                _timer.Change(5000, Timeout.Infinite);
            }
            _callCount ++;
        }

        if(_callCount >= ExecuteImmediatelyCallCount)
        {
            _timer.Change(Timeout.Infinite, Timeout.Infinite);
            Batch(null);
        }
        _manualResetEvent.WaitOne();
    }

    private void Batch(object state)
    {
        lock (_syncLock)
        {
            if(_orders.Count > 0)
            {
                RemoteService.Send(_orders);
                _orders.Clear();
                _manualResetEvent.Reset();
            }
            _callCount = 0;
        }
    }
)


438
1
задан 17 ноября 2011 в 04:11 Источник Поделиться
Комментарии
1 ответ

Не уверен, что это за требование 5 секунд, но от верхнего уровня (прокомментируйте, пожалуйста, ответьте на пункты, отмеченные как предупреждения):

public sealed class Batcher
{
private readonly object _syncLock = new object();
private readonly Timer _timer;
private bool _timerSet = false;
private volatile int _callCount = 0;
private const int ExecuteImmediatelyCallCount = 3;
private readonly ManualResetEvent _manualResetEvent = new ManualResetEvent(false);
private readonly List<Order> _orders = new List<Order>();

public Batcher()
{
_timer = new Timer(Batch, null, Timeout.Infinite, Timeout.Infinite);
}
#warning What is the "orders" parameter for
public void TryBatch(IEnumerable<Order> orders)
{
#warning don't see a point to lock this operation
lock (_syncLock)
{
_orders.AddRange(orders);
if(!_timerSet)
{
_timerSet = true;
_timer.Change(5000, Timeout.Infinite);
}
_callCount ++;
}
#warning not thread safe
if(_callCount >= ExecuteImmediatelyCallCount)
{
_timer.Change(Timeout.Infinite, Timeout.Infinite);
Batch(null);
}
#warning what is this for?
_manualResetEvent.WaitOne();
}

private void Batch(object state)
{
lock (_syncLock)
{
if(_orders.Count > 0)
{
#warning not thread safe
RemoteService.Send(_orders);
_orders.Clear();
_manualResetEvent.Reset();
}
_callCount = 0;
}
}
)

1
ответ дан 17 ноября 2011 в 10:11 Источник Поделиться