Одноразовое действие в постоянном цикле - 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)); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д