У меня есть два метода. Один метод, который извлекает некоторые данные, а другой - обрабатывает эти данные. Оба алгоритма работают с другой скоростью, поэтому я хочу синхронизировать производительность обоих алгоритмов, чтобы они работали со скоростью узкого места. Я думал об использовании очереди сообщений максимального размера. Пока очередь не достигнет максимального размера, метод поиска продолжает заполнять список, в то время как метод обработки удаляет элементы из списка в другом потоке до тех пор, пока в списке есть элементы. Если список достигает максимального размера, он будет ждать, пока очередь больше не будет иметь максимальный размер.Синхронизация производительности двух алгоритмов с характеристиками самого медленного узкого места
Это звучит как наиболее логичный подход?
Я думал о том или иной форме родового класса что-то вдоль линий
Queue<T> _theQueue;
private int _maxQueueSize;
Func<T> _processor;
Func<T> _populator;
ChasedQueue(Func<T> processor, Funct<T> populator, int maxQueueSize = 30)
{
_theQueue = new Queue<T>();
_maxQueueSize =
_processor = processor;
_populator = populator;
}
public void Start()
{
new Thread(() => StartChaser()).Start();
new Thread(() => StartPopulator()).Start();
}
private void StartChaser()
{
while ((element = _documentQueue.poll) != null)
{
_processor(_documentQueue.Dequeue());
}
}
private void StartPopulator()
{
foreach(var item in _populator)
{
while(_theQueue.Count < _maxQueueSize)
{
_documentQueue.Enqueue(item);
}
}
}
ReactiveExtensions, а именно [Zip] (https://msdn.microsoft.com/en-us/library/system.reactive.linq. observable.zip% 28v = vs.103% 29.aspx), кажется хорошим подходом [[здесь] (http://www.introtorx.com/content/v1.0.10621.0/12_CombiningSequences.html)]. Ваши два алгоритма просто выставляют свои потоковые результаты в качестве наблюдаемых, которые вы могли бы замерить ... –
Это именно то, что я искал. Спасибо –
@Patryk Ćwiek: Думаю, стоит упомянуть комментарий как ответ, так что вопрос можно закрыть. – sstan