myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grundlagen von C# » Schleife nach bestimmter Zeit erneut ausführen
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Schleife nach bestimmter Zeit erneut ausführen

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Nierewa
myCSharp.de-Mitglied

Dabei seit: 03.09.2019
Beiträge: 15
Entwicklungsumgebung: Sharpdevelop


Nierewa ist offline

Schleife nach bestimmter Zeit erneut ausführen

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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:

C#-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 großes Grinsen
03.09.2019 22:40 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
inflames2k inflames2k ist männlich
myCSharp.de-Poweruser/ Experte

avatar-3407.gif


Dabei seit: 03.01.2010
Beiträge: 2.213
Entwicklungsumgebung: Visual Studio 2010 Express


inflames2k ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Im einfachsten Fall empfehle ich dir die Verwendung eines Timers.
03.09.2019 22:46 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Nierewa
myCSharp.de-Mitglied

Dabei seit: 03.09.2019
Beiträge: 15
Entwicklungsumgebung: Sharpdevelop

Themenstarter Thema begonnen von Nierewa

Nierewa ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hmm,

das hab ich mir auch schon überlegt und hab per Google einiges zusammengesucht und probiert. Doch leider erhalte ich mit diesem Code:

C#-Code:
/*
* Erstellt mit SharpDevelop.
* Benutzer: Rettig
* 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;
using System.Timers;

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)
   {
              Timer t1 = new Timer(); // Timer anlegen
              t1.Interval = 100; // Intervall festlegen, hier 100 ms
              t1.Tick+=new EventHandler(t1_Tick); // Eventhandler ezeugen der beim Timerablauf aufgerufen wird
              t1.Start(); // Timer starten


                 string fileName = "";
              string sourcePath = @"Z:\DHL\";
              string targetPath =  @"Z:\DHL\Versand\";

              // Use Path class to manipulate file and directory paths.
              string sourceFile = System.IO.Path.Combine(sourcePath, fileName);
              string destFile = System.IO.Path.Combine(targetPath, fileName);


              void t1_Tick(object sender, EventArgs e)
              {
              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
               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);
               MessageBox("nochmal");
              }
              }

         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
   }

}
    }
}

nur Fehlermeldungen. Ich denke es liegt an der falschen Position des Timers, aber ich weiß nicht wo er hin muß. Kann mir jemand dabei helfen?

Wie gesagt, bin absoluter Neuling und versuche "learning by doing" fröhlich
04.09.2019 09:42 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
inflames2k inflames2k ist männlich
myCSharp.de-Poweruser/ Experte

avatar-3407.gif


Dabei seit: 03.01.2010
Beiträge: 2.213
Entwicklungsumgebung: Visual Studio 2010 Express


inflames2k ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Was erhältst du denn für Fehler? Nur "Ich erhalte Fehler" ist für keinen hilfreich.

Da ich es mir aber dennoch mal angesehen habe. Dein Code kann so halt einfach garnicht kompilieren. Du hast den Eventhandler t1_Tick mitten in die Main Methode gepackt.

Eigne dir am besten wenigstens die nötigsten Grundlagen an.
04.09.2019 09:56 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Nierewa
myCSharp.de-Mitglied

Dabei seit: 03.09.2019
Beiträge: 15
Entwicklungsumgebung: Sharpdevelop

Themenstarter Thema begonnen von Nierewa

Nierewa ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich erhalte insgesamt 37 Fehler, die ich nicht alle aufführen kann.

Zitat:
Dein Code kann so halt einfach garnicht kompilieren. Du hast den Eventhandler t1_Tick mitten in die Main Methode gepackt.

Könntest Du mir sagen wo das dann hinmuß und warum?

Ich weiß das es ohne Grundlagen nicht geht und es ist wohl auch ein Fehler gleich mit c# anzufangen wenn man noch nie programmiert hat. doch leider stehe ich unter Zeitdruck und habe nicht soviel Zeit unglücklich

C#-Code:
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>  


//*****************************************************************************

void t1_Tick(object sender, EventArgs e)


{


        string fileName = "";
              string sourcePath = @"Z:\DHL\";
              string targetPath =  @"Z:\DHL\Versand\";

              // Use Path class to manipulate file and directory paths.
              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
               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);
              }
              }



static class MyNotifyIconApplication
{
   private static NotifyIcon  notico;



    //==========================================================================
   public static void Main (string [] astrArg)
   {

   Timer t1 = new Timer(); // Timer anlegen
   t1.Interval = 100; // Intervall festlegen, hier 100 ms
   t1.Tick+=new EventHandler(t1_Tick); // Eventhandler ezeugen der beim Timerablauf aufgerufen wird
   t1.Start(); // Timer starten  




         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
   }


}
    }
}

So bekomme ich die Fehlermeldung:

Code:
1:
Für das nicht statische Feld, die Methode oder die Eigenschaft 'Zuarbeit.Program.t1_Tick(object, System.EventArgs)' ist ein Objektverweis erforderlich. (CS0120) - \SharpDevelop Projects\Zuarbeit\Zuarbeit\Program.cs:76,13

Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Nierewa am 04.09.2019 10:58.

04.09.2019 10:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
inflames2k inflames2k ist männlich
myCSharp.de-Poweruser/ Experte

avatar-3407.gif


Dabei seit: 03.01.2010
Beiträge: 2.213
Entwicklungsumgebung: Visual Studio 2010 Express


inflames2k ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

es ist absolut nichts falsch da dran direkt mit C# anzufangen. Man sollte sich allerdings anschauen, was man fabriziert und sofern Fehlermeldungen erscheinen auch mal selbst danach suchen.

Übrigens, du brauchst nicht ständig den Code der ganzen Program.cs hier posten. Der für den Fehler relevante Inhalt sollte ausreichen (wäre in dem Fall der EventHandler für Timer.Tick und die Main.

Warum der Eventhandler nun plötzlich Teil von der Klasse Programm und nicht mehr von der Klasse MyNotifyIconApplication ist erschließt sich mir ebenfalls nicht.

Vorschlag: Schieb den EventHandler zurück nach MyNotifyIconApplication und dann schau dir mal ganz genau die anderen EventHandler an.
04.09.2019 11:21 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Nierewa
myCSharp.de-Mitglied

Dabei seit: 03.09.2019
Beiträge: 15
Entwicklungsumgebung: Sharpdevelop

Themenstarter Thema begonnen von Nierewa

Nierewa ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Es sieht jetzt so aus und funktioniert:

C#-Code:
static class MyNotifyIconApplication
{

private static void t1_Tick(object sender, EventArgs e)
{
              string fileName = "";
             ...
              string destFile = System.IO.Path.Combine(targetPath, fileName);

    foreach (var fn in Directory.GetFiles(@"Z:\DHL", "*.txt")) {

                   ...
              }
}
   private static NotifyIcon  notico;
     //==========================================================================
   public static void Main (string [] astrArg)
   {

   Timer t1 = new Timer(); // Timer anlegen
   t1.Interval = 10000; // Intervall festlegen, hier 100 ms
   t1.Tick+=new EventHandler(t1_Tick); // Eventhandler ezeugen der beim Timerablauf aufgerufen wird
   t1.Start(); // Timer starten

...

Ich hab die anderen Eventhandler angesehen, da stand immer private static ... auch hingeschrieben und es geht. Warum?
04.09.2019 12:11 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
inflames2k inflames2k ist männlich
myCSharp.de-Poweruser/ Experte

avatar-3407.gif


Dabei seit: 03.01.2010
Beiträge: 2.213
Entwicklungsumgebung: Visual Studio 2010 Express


inflames2k ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Nun das liegt daran, dass alle Methoden und Eventhandler die aus einer statischen Methode heraus aufgerufen werden auch statisch sein müssen.

Das ist leider schon für die Main-Methode Zwangsläufig der Fall. In der Regel ist es sowieso besser, Funktionalitäten in eine eigene Klasse auszulagern nicht statisch auszuführen.

Sofern du dich weitergehend mit der Programmierung beschäftigen möchtest, solltest du dich daher erst einmal besser einlesen.
04.09.2019 13:57 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Nierewa
myCSharp.de-Mitglied

Dabei seit: 03.09.2019
Beiträge: 15
Entwicklungsumgebung: Sharpdevelop

Themenstarter Thema begonnen von Nierewa

Nierewa ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Als nächsten Schritt wollte ich eine Konfiguratiosdatei benutzen. Der Nutzer soll den Quell- und Zielpfad selbst bestimmen können... ist das zu hoch für mich und Utopie?

Oder zeigt mir jemand wie es geht?

Das Formular dazu hab ich schon entsprechend erstellt...
05.09.2019 00:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
hypersurf hypersurf ist männlich
myCSharp.de-Mitglied

Dabei seit: 16.10.2008
Beiträge: 468
Entwicklungsumgebung: VS Studio 2019, Android Studio
Herkunft: Münster


hypersurf ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

05.09.2019 07:36 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MarsStein MarsStein ist männlich
myCSharp.de-Poweruser/ Experte

avatar-3191.gif


Dabei seit: 27.06.2006
Beiträge: 3.126
Entwicklungsumgebung: VS 2013, MonoDevelop
Herkunft: Trier -> München


MarsStein ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

siehe auch  [Tutorial] Konfigurationsmodell im .NET Framework

und beachte zukünftig  [Hinweis] Wie poste ich richtig? Punkt 1.2

Gruß, MarsStein
05.09.2019 12:00 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Nierewa
myCSharp.de-Mitglied

Dabei seit: 03.09.2019
Beiträge: 15
Entwicklungsumgebung: Sharpdevelop

Themenstarter Thema begonnen von Nierewa

Nierewa ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Danke für die Links. Werd ich mich mal einlesen fröhlich

@MarsStein:
Sorry, wenn ich weitere Fragen habe öfnne ich einen neuen Thread
05.09.2019 22:22 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als ein Monat.
Der letzte Beitrag ist älter als ein Monat.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 14.10.2019 01:31