Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Организация буфера данных


Автор: Stratus 20.12.2011, 13:53
Колеги 

Возник вопрос корректной организации буфера данных.

Суть следующая организовать очередь которая будет получать данные данные от источника а затем раздавать подписчикам и все это в отдельном потоке.

Пытаюсь организовать это следующим образом.

Код

    class Program
    {
        static internal Queue<int> Data = new Queue<int>();
        static private Thread DataThread1;
        static bool Stop = false;

        
        static void Main(string[] args)
        {
            ThreadQuotes = new Thread(new ThreadStart(ScanData));
            ThreadQuotes.Name = "DataThread1";
            ThreadQuotes.Start();
        }


        static public void SendIQuotes(int Digit)
        {
            Monitor.Enter(Data);
                StartTime = DateTime.Now;
                    Data.Enqueue(Digit);
                EndTime = DateTime.Now;
            Monitor.Exit(Data);
        }

        static private void ScanQuotes()
        {
            while (!Stop)
            {
                if (Quotes.Count > 0)
                {
                    if (Monitor.TryEnter(Data))
                    {
                        int CurrentQuote = Data.Dequeue();
                        Monitor.Exit(Data);
                        //здесь можно реализовать вызов метода отправки подписчикам
                    }
                }
                else Thread.Sleep(1);
            }
        }
    }


Вопрос:
1) Какой поток пытается усыпить Thread.Sleep(1), поток DataThread1 или основной поток?
2) Как болеее эффективно организовать данную конструкцию чтобы не приостанавливать потоки?

Автор: Stratus 21.12.2011, 12:15
Неужели никто с этим не сталкивался?

Автор: jonie 22.12.2011, 21:28
.net4 содержит класс ConcurrentQueue. Используйте лучше его чем писать велосипеды... ну или кнута почитайте, а потом рихтера.

а вот кстати для вас (судя по названиям) более подходящий вариант: http://code.google.com/p/disruptor/?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)