Одноразовое действие в постоянном цикле - C#

Узнай цену своей работы

Формулировка задачи:

У меня в методе имеется постоянный цикл, можно в него что-то запихать чтобы он определённое действие выполнял только один раз?

Решение задачи: «Одноразовое действие в постоянном цикле»

textual
Листинг программы
using System;
using System.Collections.Concurrent;
using System.Threading;
 
 
namespace Command
{
    class Program
    {
        private static readonly ConcurrentQueue<ICommand> _queue = new ConcurrentQueue<ICommand>(); 
        private static readonly ManualResetEvent _event = new ManualResetEvent(false);
        private static readonly Random _random = new Random();
 
        static void Main(string[] args)
        {
            ThreadPool.QueueUserWorkItem(o => Do());
            for (int i = 0; i < 100; ++i)
            { 
                AddCommand1(); AddCommand2();
                Thread.Sleep(1000);    
            }
            Console.ReadKey();
        }
 
        private static void AddCommand1()
        {
            var command = new Command1(_random.Next(2, 10));
            _queue.Enqueue(command);
            _event.Set();
        }
 
        private static void AddCommand2()
        {
            var command = new Command2(string.Format("Random {0}", _random.Next()));
            _queue.Enqueue(command);
            _event.Set();
        }
 
        private static void Do()
        {
            while (_event.WaitOne(10000)) //если не поступило ни одной задачи в течении 10 с, то выходим 
            {
                if(_queue.Count == 0) //если очередь задач пуста, то заставляем поток заснуть, до поступления очередной задачи
                {
                    _event.Reset();
                    continue;
                }
                ICommand command;
                while (!_queue.TryDequeue(out  command)) ; //пытаемся безопасно извлечь задачу
                command.Execute(); //выполняем и забываем об этом
            }
            Console.WriteLine("Time out");
        }
    }
 
    interface ICommand
    {
        void Execute();
    }
 
    class Command1 : ICommand
    {
        private readonly double _param;
 
        public Command1(double param)
        {
            _param = param;
        }
 
        public void Execute()
        {
            Console.WriteLine(Math.Pow(_param, 3));
        }
    }
 
    class Command2 : ICommand
    {
        private readonly string _param;
 
        public Command2(string param)
        {
            _param = param;
        }
 
        public void Execute()
        {
            var chars = _param.ToCharArray();
            Array.Reverse(chars);
            Console.WriteLine(new string(chars));
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5
Похожие ответы