public void Produce()
        {
            var path = System.Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);

            while (!_stop)
            {
                string fileName = Path.Combine(path, "ConsumerProducerFiles", Guid.NewGuid().ToString() + ".txt");
                using (StreamWriter fileStream = File.CreateText(fileName))
                {
                    WriteFile(fileStream, wordCount);
                }

                var success = _buffer.TryAdd(fileName);

                if (!success)
                {
                    try
                    {
                        File.Delete(fileName);
                    }
                    finally
                    {
                        Thread.Sleep(sleepCount);
                    }
                }
                Thread.Sleep(sleepCount);
            }
        }
        public void Produce(int wordCount, int sleepCount)
        {
            while (true)
            {
                string ayy = Guid.NewGuid().ToString();
                using (FileStream fileStream = new FileStream("~/Files/" + ayy + ".txt", FileMode.Create))
                {
                    writeFile(fileStream, wordCount);

                    var success = _buffer.TryAdd(ayy);

                    if (success)
                    {
                        continue;
                    }
                    else
                    {
                        Thread.Sleep(sleepCount * 2);
                    }
                }
                Thread.Sleep(sleepCount);
            }
        }
Esempio n. 3
0
        public HttpStatusCode Post(Settings newSettings)
        {
            if (_worker._settings == null)
            {
                _worker._settings = new Settings();
            }

            if (newSettings == null)
            {
                return(HttpStatusCode.BadRequest);
            }

            if (_worker._settings.Equals(newSettings))
            {
                return(HttpStatusCode.OK);
            }
            //else

            lock (_worker.locker)
            {
                if (_worker._buffer == null)
                {
                    _worker._buffer = new ConcurrentBuffer(newSettings.BufferSize);
                }

                if (_worker._buffer.Size != newSettings.BufferSize)
                {
                    var buffer = new ConcurrentBuffer(newSettings.BufferSize);

                    //Grab all items in old buffer and place in new buffer.
                    _worker._buffer.switching = true;
                    string[] items = _worker._buffer.ToArray();
                    foreach (var item in items)
                    {
                        buffer.TryAdd(item);
                    }
                    _worker._buffer = buffer;
                    Parallel.ForEach(_worker._threadManager.GetRunningThreads(), (tuple) => { tuple.Item2._buffer = _worker._buffer; });
                }

                if (_worker._settings.ProducerWordCount != newSettings.ProducerWordCount)
                {
                    Parallel.ForEach(_worker._threadManager.GetRunningThreads(), (tuple) => { tuple.Item2.wordCount = newSettings.ProducerWordCount; });
                }

                if (_worker._settings.ProducerSleepNum != newSettings.ProducerSleepNum)
                {
                    Parallel.ForEach(_worker._threadManager.GetRunningThreads(), (tuple) => { tuple.Item2.sleepCount = newSettings.ProducerSleepNum; });
                }

                while (newSettings.NumOfProducers > _worker._threadManager.CurrentCount)
                {
                    ProducerWorker producer = new ProducerWorker(_worker._buffer, newSettings.ProducerWordCount,
                                                                 newSettings.ProducerSleepNum);
                    Thread thread = new Thread(producer.Produce)
                    {
                        Name         = "Producer " + Guid.NewGuid().ToString(),
                        IsBackground = false
                    };
                    thread.SetApartmentState(ApartmentState.MTA);

                    _worker._threadManager.AddThread(thread, producer);
                    thread.Start();
                }

                while (newSettings.NumOfProducers < _worker._threadManager.CurrentCount)
                {
                    var tuple = _worker._threadManager.GetRunningThreads()[0];
                    _worker._threadManager.KillThread();
                }
                _worker._settings = newSettings;
            }
            return(HttpStatusCode.OK);
        }