У меня есть служба, которая постоянно обрабатывает данные, она получает запросы на обработку новых данных через обмен сообщениями.Пока он занят обработкой новых запросов, они объединяются вместе, поэтому все они обрабатываются одновременно.AutoResetEvent используется для уведомления процессора о том, что новый запрос доступен.
Мой вопрос связан с EventLoop, если возможно, что currentRequest после WaitOne будет нулевым?
Это плохая практика дляесть _eventAvailable.Set () вне блокировки (_eventLocker)?Я переместил это так, чтобы это не начало идти в WaitOne и немедленно оспаривать блокировку (_eventLocker).
Есть предложения, как лучше написать следующий код?
public sealed class RealtimeRunner : MarshalByRefObject
{
/// <summary>
/// The actual event, new events get merged into this if it is not null
/// </summary>
private Request _pendingRequest;
/// <summary>
/// Used to signal the runner thread when an event is available to process
/// </summary>
private readonly AutoResetEvent _eventAvailable = new AutoResetEvent(false);
private readonly object _eventLocker = new object();
/// <summary>
/// Called on a background thread via messaging
/// </summary>
public void QueueEvent(RealtimeProcessorMessage newRequest)
{
bool mergedRequest;
lock (_eventLocker)
{
if (_pendingRequest == null)
{
mergedRequest = false;
_pendingRequest = new Request(newRequest, _engine);
}
else
{
mergedRequest = true;
_pendingRequest.Merge(newRequest, _engine);
}
}
_eventAvailable.Set();
}
/// <summary>
/// This is running on its own thread
/// </summary>
private void EventLoop()
{
while (true)
{
// Block until something exists in _pendingRequest
_eventAvailable.WaitOne();
Request currentRequest;
lock (_eventLocker)
{
currentRequest = _pendingRequest;
_pendingRequest = null;
}
// CAN THIS EVER BE NULL?
if (currentRequest == null)
continue;
//do stuff with the currentRequest here
}
}
}