2011-05-10 14 views
17

¿Cómo puedo ejecutar el un bucle particluar durante un tiempo especificadola forma de ejecutar el bucle de tiempo específico

Timeinsecond = 600 

int time = 0; 
while (Timeinsecond > time) 
{ 
    // do something here 
} 

¿Cómo puedo configurar el varaible tiempo aquí, si puedo usar el inicio objeto Timer y el método detenerlo doesnot devolverme tiempo en segundos

Saludos NewDev

Respuesta

15

Si desea facilidad de uso:

Si no tiene requisitos de exactitud (exactitud fuertes verdadero nivel de milisegundos - tales como escribir un alto fotogramas por segundo videojuego o simulación en tiempo real similar), entonces simplemente puede utilizar la estructura System.DateTime:

// Could use DateTime.Now, but we don't care about time zones - just elapsed time 
// Also, UtcNow has slightly better performance 
var startTime = DateTime.UtcNow; 

while(DateTime.UtcNow - startTime < TimeSpan.FromMinutes(10)) 
{ 
    // Execute your loop here... 
} 

Cambie TimeSpan.FromMinutes para que sea el período de tiempo que requiera, segundos, minutos, etc.

En el caso de llamar a algo así como un servicio web, mostrar algo al usuario durante un corto período de tiempo o verificar archivos en disco , Usaría esto exclusivamente.

Si desea una mayor precisión:

vistazo a la clase Stopwatch, y comprobar el miembro Elapsed. Es un poco más difícil de usar, porque tienes que iniciarlo, y it has some bugs which will cause it to sometimes go negative, pero es útil si necesitas una precisión real de milisegundos.

Para usarlo:

var stopwatch = new Stopwatch(); 
stopwatch.Start(); 

while(stopwatch.Elapsed < TimeSpan.FromSeconds(5)) 
{ 
    // Execute your loop here... 
} 
+9

'DateTime.Now' es lento (aproximadamente 1000ns en mi máquina). Debería usar 'DateTime.UtcNow' en su lugar porque es aproximadamente 100 veces más rápido debido a que no tiene que realizar una conversión de zona horaria. – Gabe

+1

@Gabe: Buena información. Gracias por enseñarme algo :) Editar la respuesta ... –

38

puede ser la siguiente ayuda:

Stopwatch s = new Stopwatch(); 
    s.Start(); 
    while (s.Elapsed < TimeSpan.FromSeconds(600)) 
    { 
     // 
    } 

    s.Stop(); 
0

crear una función para reproducir, parar, y el tiempo transcurrido de la siguiente manera:

Class CustomTimer 
{ 
    private DateTime startTime; 
    private DateTime stopTime; 
    private bool running = false; 

    public void Start() 
    { 
     this.startTime = DateTime.Now; 
     this.running = true; 
    } 

    public void Stop() 
    { 
     this.stopTime = DateTime.Now; 
     this.running = false; 
    } 

    //this will return time elapsed in seconds 
    public double GetElapsedTimeSecs() 
    { 
     TimeSpan interval; 

     if (running) 
      interval = DateTime.Now - startTime; 
     else 
      interval = stopTime - startTime; 

     return interval.TotalSeconds; 
    } 

} 

Ahora dentro de su circuito foreach haga lo siguiente:

CustomTimer ct = new CustomTimer(); 
    ct.Start(); 
    // put your code here 
    ct.Stop(); 
    //timeinsecond variable will be set to time seconds for your execution. 
    double timeinseconds=ct.GetElapsedTime(); 
-2

Es feo .... pero se puede probar esto:

DateTime currentTime = DateTime.Now; 
DateTime future = currentTime.AddSeconds(5); 
while (future > currentTime) 
{ 
    // Do something here .... 
    currentTime = DateTime.Now; 
    // future = currentTime.AddSeconds(5); 
} 
+0

¿por qué los votos a favor? –

-2

En lugar de una operación tan costosa, recomiendo este:

using System.Threading; 

Thread.Sleep(600000); 
+0

No es una buena idea poner el hilo principal a dormir. Desperdicio de recursos y NO es en absoluto una buena práctica. –

+0

Estoy completamente de acuerdo, sin embargo, es mejor sentarse y esperar que correr desperdiciando recursos, la pregunta en sí es acaso académica. –

0
using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using Accord.Video.FFMPEG; 


namespace TimerScratchPad 
{ 
    public partial class Form1 : Form 
    { 
     VideoFileWriter writer = new VideoFileWriter(); 
     int second = 0; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      writer.VideoCodec = VideoCodec.H264; 
      writer.Width = Screen.PrimaryScreen.Bounds.Width; 
      writer.Height = Screen.PrimaryScreen.Bounds.Height; 
      writer.BitRate = 1000000; 
      writer.Open("D:/DemoVideo.mp4"); 

      RecordTimer.Interval = 40; 
      RecordTimer.Start(); 

     } 

     private void RecordTimer_Tick(object sender, EventArgs e) 
     { 
      Rectangle bounds = Screen.GetBounds(Point.Empty); 
      using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height)) 
      { 
       using (Graphics g = Graphics.FromImage(bitmap)) 
       { 
        g.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size); 
       } 
       writer.WriteVideoFrame(bitmap); 
      } 

      textBox1.Text = RecordTimer.ToString(); 
      second ++; 
      if(second > 1500) 
      { 
       RecordTimer.Stop(); 
       RecordTimer.Dispose(); 
       writer.Close(); 
       writer.Dispose(); 
      } 
     } 
    } 
} 
+0

este código se ejecutará sin consumir más recursos del sistema y nunca experimentará ralentización del sistema como al ejecutarlo durante el ciclo este código tomará capturas de pantalla y escribirá en archivos de video por cada 40 milisegundos, es decir, 24FPS –

Cuestiones relacionadas