2016-10-26 3 views
0

Мне нужен самый простой возможный таймер для повторения моего кода бесконечно каждые 5 секунд. Никакие внешние классы или этажерку ..Простейший возможный бесконечный повтор

Просто:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("Now the following code will be repeated over and over"); 

     //////////////// FOLLOWING CODE ///////////////// 
     /* the repeated code */ 
     //////////////// END OF FOLLOWING CODE ///////////////// 

    } 
} 

Как я могу это сделать?

+2

Записывайте бесконечную петлю и сна в течение 5 секунд – Bharat

+0

Но как я могу заставить поток спать? Я не знаю .. – Totallama

+0

просто напишите 'Thread.Sleep (5000);' – Bharat

ответ

1

Использование while(true) с Thread.Sleep

using System.Threading; 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Now the following code will be repeated over and over"); 

      while(true) 
      { 
       //////////////// FOLLOWING CODE ///////////////// 
       /* the repeated code */ 
       //////////////// END OF FOLLOWING CODE ///////////////// 
       Thread.Sleep(5000); 
      } 
     } 
    } 
+0

Необработанное исключение типа: «Microsoft.CSharp.RuntimeBinder.RuntimeBinderException» произошел в System.Core.dll – Totallama

+0

Это может быть связано с проблемы в коде, который вы пытаетесь повторить навсегда. – geo

+0

На самом деле, у меня есть код выше, но внутри есть только Console.WriteLine() – Totallama

0

Использование BackgroundWorker Класс:

Справочные ссылки: Background worker

Если вы используете рамки> = 4.5.2 QueueBackgroundWorkItem

QueueBackgroundWorkItem

+0

Нет внешних классов или чего-то еще .. –

+0

Его внешний вид @LeonardKlausmann –

1

Использование Timer.

static void Main(string[] args) 
{ 

    Timer timer = new System.Threading.Timer((e) => 
    { 
     Console.WriteLine("Now the following code will be repeated over and over"); 
    }, null, 0, (int)TimeSpan.FromSeconds(5).TotalMilliseconds); 

    Console.Read(); 
} 

Здесь я назвал Console.WriteLine несколько раз, вы можете написать свой блок кода вместо него.

Вы можете использовать Thread.Sleep(5000); Но опять же его внешний класс в соответствии с OP.

Но я бы предложил лучшее решение с использованием Async и Await. Еще одна вещь, которую вы должны иметь условие завершения, чтобы вы не вызывали бесконечного вызова, чтобы избежать ненужного потребления памяти.

public static async Task RepeatActionEveryInterval(Action action, TimeSpan interval, CancellationToken cancelToken) 
{ 
    while (true) 
    { 
     action(); 
     Task task = Task.Delay(interval, cancelToken); 

     try 
     { 
      await task; 
     } 

     catch (TaskCanceledException) 
     { 
      return; 
     } 
    } 
} 


static void Main(string[] args) 
{ 

    CancellationTokenSource cancelToken = new CancellationTokenSource(TimeSpan.FromSeconds(50)); 
    Console.WriteLine("Start"); 
    RepeatActionEveryInterval(() => Console.WriteLine("Repeating Code"), TimeSpan.FromSeconds(5), cancelToken.Token).Wait(); 
    Console.WriteLine("End"); 
    Console.Read(); 
} 

В этом примере этот код будет писать до 50 секунд.

+1

@LeonardKlausmann Его не внешний –

+1

, тогда Timer также не является внешним классом. Эффективный мудрый таймер лучше, чем Thread.Sleep() –

+0

Вы правы. Timer принадлежит к System.Threading –

1

Используйте этот код для рекурсивно вызывать вашу функцию каждые 5 секунд.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 

namespace recurssiveWithThread 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 

      RecWork();  
     } 
     public static int i = 0; 
     public static void RecWork() 
     { 
      // Do the things whatever you needed here 

      i++; 
      Console.WriteLine(i); 
      //Thread to make the process to sleep for sometimes 
      Thread.Sleep(5000); 

      //Call your function here 
      RecWork(); 
     }   
    } 
} 
+0

Это переполнение стека, которое должно произойти ... –

+0

StackOverflowException. – bhuvin

+0

Просто любопытно. Это собирается повысить поток stackoverflow из-за «i ++»? Или я что-то пропустил? –

1

Простейшая форма этого:

using System.Threading; 

static void Main(string[] args) 
{ 
    bool breakConditionFlag = false; 
    ManualResetEvent waitHandler = new ManualResetEvent(false); 

    while(breakConditionFlag) 
    { 

    //Your Code 

    waitHandler.WaitOne(TimeSpan.FromMilliseconds(1000)); // 1000 is the Arbitary value you can change it to Suit your purpose; 

    } 
} 

Почему ManualResetEvent?

Событие более эффективно использует процессоры - вам не нужно разбудить родительский поток до опроса. Ядро разбудит вас, когда произойдет пожар.

+0

Ошибка \t CS0117 \t ' TimeSpan 'не содержит определения для «FromMilliSeconds» – Totallama

+0

@Totallama: используйте Intellisense. Это поможет. Не ожидайте, что вас будут кормить ложкой, это так. – bhuvin

+0

Проверить прямо сейчас; Это была Типо. В чем бы вам помог Intellisense. – bhuvin

Смежные вопросы