Ankündigung

Einklappen
Keine Ankündigung bisher.

Schleife nach bestimmter Zeit erneut ausführen

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Schleife nach bestimmter Zeit erneut ausführen

    Hallo,

    ich bin Anfänger und habe eine Frage, die wahrscheinlich manche zum Lachen bringt.

    In meinem Quellcode habe ich eine Foreach-Schleife.
    Diese soll alle 15 Sekunden ausgeführt werden so lange das Programm offen ist.

    Es handelt sich um eine Windows-Anwendung bei der eun Notification Icon im Systray zu sehen ist, sonst nichts.
    Den Code Schnippsel habe ich von hier: https://dotnet-snippets.de/snippet/v...-anwendung/541

    und hier ist der Code:
    Code:
    /*
     * Erstellt mit SharpDevelop.
     * Datum: 02.09.2019
     * Zeit: 13:24
     *
     * Sie können diese Vorlage unter Extras > Optionen > Codeerstellung > Standardheader ändern.
     */
    using System;
    using System.Windows.Forms;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.IO;
    using System.Drawing;
    
    namespace Zuarbeit
    {
        /// <summary>
        /// Class with program entry point.
        /// </summary>
        internal sealed class Program
        {
            /// <summary>
            /// Program entry point.
            /// </summary>  
    
    
    //*****************************************************************************
    static class MyNotifyIconApplication
    {
       private static NotifyIcon  notico;
    
        //==========================================================================
       public static void Main (string [] astrArg)
       {
                  string fileName = "";
                  string sourcePath = @"Z:\DHL\";
                  string targetPath =  @"Z:\DHL\Versand\";
    
                  // hier werden die Pfade angegeben
                  string sourceFile = System.IO.Path.Combine(sourcePath, fileName);
                  string destFile = System.IO.Path.Combine(targetPath, fileName);
    
                  foreach (var fn in Directory.GetFiles(@"Z:\DHL", "*.txt")) {
    
                    // Eine Backupdatei von der Quelldatei anlegen
                    fileName = System.IO.Path.GetFileNameWithoutExtension(fn);
                   destFile = System.IO.Path.Combine(sourcePath, fileName+".bak");
                   System.IO.File.Copy(fn, destFile, true);
    
                   // in der Textdatei alle # mit | ersetzen.
                   string text = File.ReadAllText(fn);
                   text = text.Replace("#", "|");
                   File.WriteAllText(fn, text);
    
                   // die Datei in den Zielordner kopieren und danach löschen - hier könnte wohl auch gleich verschoben werden ^^
                   fileName = System.IO.Path.GetFileName(fn);
                   destFile = System.IO.Path.Combine(targetPath, fileName);
                   System.IO.File.Copy(fn, destFile, true);
                   System.IO.File.Delete(fn);
                  }
    
          ContextMenu cm;
          MenuItem    miCurr;
          int         iIndex = 0;
    
          // Kontextmenü erzeugen
          cm = new ContextMenu ();
    
          // Kontextmenüeinträge erzeugen
          miCurr = new MenuItem ();
          miCurr.Index = iIndex++;
          miCurr.Text = "&Aktion 1";           // Eigenen Text einsetzen
          miCurr.Click += new System.EventHandler (Action1Click);
          cm.MenuItems.Add (miCurr);
    
          // Kontextmenüeinträge erzeugen
          miCurr = new MenuItem ();
          miCurr.Index = iIndex++;
          miCurr.Text = "&Beenden";
          miCurr.Click += new System.EventHandler (ExitClick);
          cm.MenuItems.Add (miCurr);
    
          // NotifyIcon selbst erzeugen
          notico = new NotifyIcon ();
          notico.Icon = new Icon("smile.ico"); // Eigenes Icon einsetzen
          notico.Text = "Doppelklick mich!";   // Eigenen Text einsetzen
          notico.Visible = true;
          notico.ContextMenu = cm;
          notico.DoubleClick += new EventHandler (NotifyIconDoubleClick);
    
          // Ohne Appplication.Run geht es nicht
          Application.Run ();
       }
    
       //==========================================================================
       private static void ExitClick (Object sender, EventArgs e)
       {
          notico.Dispose ();
          Application.Exit ();
       }
    
       //==========================================================================
       private static void Action1Click (Object sender, EventArgs e)
       {
          // nur als Beispiel:
          // new MyForm ().Show ();
       }
    
       //==========================================================================
       private static void NotifyIconDoubleClick (Object sender, EventArgs e)
       {
          // Was immer du willst
       }
    
    }
        }
    }
    Danke
    Zuletzt geändert von Nierewa; 02.09.2019, 17:41.

  • #2
    Hallo!

    Asychrone Tasks sind eine Lösung. Hier ein Codebeispiel.

    PHP-Code:
    using System;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Threading;

    namespace 
    AsyncInfiniteLoops
    {
        
    /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        
    public partial class MainWindow Window
        
    {
            public 
    MainWindow()
            {
                
    InitializeComponent();
            }

            private 
    async Task DoWorkAsyncInfiniteLoop()
            {
                while (
    true)
                {
                    
    // do the work in the loop
                    
    string newData DateTime.Now.ToLongTimeString();

                    
    // update the UI
                    
    txtTicks.Text "ASYNC LOOP - " newData;

                    
    // don't run again for at least 200 milliseconds
                    
    await Task.Delay(200);
                }
            }

            private 
    void bttnStart_Click(object senderRoutedEventArgs e)
            {
                
    //DoWorkPollingTask();
                //DoWorkTimer();

                // invoke RunTimer but DO NOT await it
                
    DoWorkAsyncInfiniteLoop();
            }

            
    #region POLLINGTASK METHOD
            
    void DoWorkPollingTask()
            {
                
    Task.Run(async () =>
                {
                    while (
    true)
                    {
                        
    // do the work in the loop
                        
    string newData DateTime.Now.ToLongTimeString();

                        
    // marshal back over to the UI thread to update the UI
                        
    Dispatcher.Invoke(() => txtTicks.Text "TASK - " newData);

                        
    // don't run again for at least 200 milliseconds
                        
    await Task.Delay(200);
                    }
                });
            }
            
    #endregion

            #region DISPATCHERTIMER METHOD
            
    DispatcherTimer _timer = new DispatcherTimer();

            
    void DoWorkTimer()
            {
                
    // execute at a minimum of 200 milliseconds between ticks
                
    _timer.Interval TimeSpan.FromMilliseconds(200);
                
    _timer.Tick += _timer_Tick;
                
    _timer.IsEnabled true;
            }

            
    void _timer_Tick(object senderEventArgs e)
            {
                
    // do the work in the loop
                
    string newData DateTime.Now.ToLongTimeString();

                
    // update the UI on the UI thread
                
    txtTicks.Text "TIMER - " newData;
            }
            
    #endregion
        
    }

    cu

    Kommentar

    Lädt...
    X