• 0

C# unsichtbares Fenster

Frage

Moin!

Ich hab ein Programm das ähnlich wie ein Service im Hintergrund laufen soll. Es hat kein Fenster und wird auch nicht in der Taskleiste angezeigt.

Soweit so gut funktioniert es auch. Benutzt dazu wurde folgender Code:

					this.FormBorderStyle = FormBorderStyle.None;
                    this.ShowInTaskbar = false;
                    this.Load += new EventHandler(Form1_Load);

private void Form1_Load(object sender, EventArgs e)
        {
            this.Size = new Size(0, 0);
        }

Jetzt soll das auch bei Fehlern so bleiben, das Programm schreibt bei Fehlern in eine Text-Datei und pausiert dann für 10 Minuten bevor es erneut den Code in einer Schleife ausführt. Allerdings hab ich nun das Problem das anscheinend bei Thread.Sleep() das Programm in der Taskleiste mit buntem Symbol auftaucht. Man kann es nicht anklicken, es erscheint natürlich kein Fenster aber für den Benutzer ist es natürlich irritierend. Der Code zum Fehler abfangen sieht so aus:

while ()
            {
                try
                {
                }

                catch (Exception ex)
                {
                    sw = new StreamWriter(tmpPath + "TicianClient.log", true);
                    sw.WriteLine(ex.Message + " " + DateTime.Now);
                    sw.Close();
                    Thread.Sleep(600000);
                }
			}

Eine Idee warum das so ist und wie ich das vermeiden kann?

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

14 Antworten auf diese Frage

  • 0

Hi,

Wäre es nicht sinnvoller als Start-Projekt anstatt einer "Forms-Anwendung" ein StartProjekt vom Typ "Windows Service" zu nutzen?
Dann kann das Programm später direkt über die Dienste gesteuert werden.

Gruß

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0
vor 6 Minuten schrieb Mttkrb:

Hi,

Wäre es nicht sinnvoller als Start-Projekt anstatt einer "Forms-Anwendung" ein StartProjekt vom Typ "Windows Service" zu nutzen?
Dann kann das Programm später direkt über die Dienste gesteuert werden.

Gruß

Das ist nicht nur sinnvoller, sondern es sollte auch so gemacht werden:

Walkthrough: Creating a Windows Service Application in the Component Designer

 

 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Ich hatte es mal probiert. Ich slebst kann kein WIndows-Service erstellen mit meiner Community-Edition. Mein Ausbilder hat es erstellt und ich sollte es bearbeiten aber dann waren da Dinge in der Anleitung die ich einstellen sollte und bei mir nicht gefunden habe also habe ich es gelassen.

@Gottlike Steht bereits in meinem Code, macht es einen unterschied wenn ich es in den "Form_Load" reinschmeiße?

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Die Vorlage ist unter Umständen nicht direkt sichtbar.

Wenn du ein neues projekt über File->New->Project hinzufügst, rechts oben in der Suchmaske "Windows Service" eintragen. Dann sollte die Projektvorlage auftauchen. Alles andere ist nur frickelei.

bearbeitet von Mttkrb

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0
vor 11 Minuten schrieb Tician:

 

@Gottlike Steht bereits in meinem Code, macht es einen unterschied wenn ich es in den "Form_Load" reinschmeiße?

Worunter steht es denn momentan?
Ich würde es einfach im Konstruktor definieren.

 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0
vor 24 Minuten schrieb Gottlike:

Worunter steht es denn momentan?
Ich würde es einfach im Konstruktor definieren.

 

Warum nicht gleich im Designer festlegen?

Dennoch ist das eine Frickelei und sollte auch so nicht umgesetzt werden.
In ein WinForms-Projekt sollte keine Logik hinterlegt werden. Eigentlich sollte grundsätzlich in kein ausführbares Projekt Logik hinterlegt werden, weil es die Wiederverwendbarkeit erschwert.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Wenn es sauber sein soll, sollte man meiner Meinung nach auch auf WPF anstatt WinForms setzen. Die Projektstruktur sauber nach dem MVVM-Pattern aufbauen und die Kollegen sind auch glücklich, wenn diese mal mit am Projekt arbeiten müssen :-)

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Abgesehen von all' den anderen Problemen, die bereits angesprochen wurden, würde ich

Thread.Sleep()

in einer Anwendung (fast) immer vermeiden. Guck' dir stattdessen mal einen Timer (System.Windows.Forms.Timer oder System.Timers.Timer) an und lass den einfach nach 10 Minuten "ticken". Dann hängst du dein Programm nicht für 10 Minuten auf und es sollte auch nicht zu irgendwelchem "komischen" Verhalten kommen.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Bei uns gibt es niemanden der Programmieren kann und außer mir und meinem Ausbilder gibt es auch keine anderen Informatiker hier. Was ich mache sind im Prinzip nur kleine Dinge die einem das Leben (arbeiten^^) einfacher machen sollen.

Mein Problem war das ich schon einen Timer habe und IN diesem Timer soll bei einem Exception 10 Minuten pausiert werden, bevor der Timer wieder losrennt, aber das habe ich gelöst.

Zurück zum Topic, alles was meine Form und deren Sichtbarkeit betrifft sieht so aus:

		public Form1()
        {
                    this.FormBorderStyle = FormBorderStyle.None;
                    this.ShowInTaskbar = false;
                    this.Load += new EventHandler(Form1_Load);
		}

        private void Form1_Load(object sender, EventArgs e)
        {
            this.Size = new Size(0, 0);
        }

Funktioniert ja wie gesagt auch einwadnfrei, es sei denn ein Exception wird geworfen (Wie gesagt die Exception ist im Timer.Tick Event drin)

catch (Exception ex)
            {
                sw = new StreamWriter(tmpPath + "MessageClient.log", true);
                sw.WriteLine(ex.Message + " " + DateTime.Now);
                sw.Close();
                Thread.Sleep(600000);
            }

Dann taucht in der Taskleiste ein Fenster auf das einfach nur nervig ist und mit dem man nichts tun kann, weder schließen noch anklicken noch sonst irgendwas. Wenn die Sleep-Zeit vorbei ist tut es dann wieder und das Fenster ist verschwunden.

Das wäre gerade "nur" ein Schönheitsfehler

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
  • 0

Nur eine Vermutung:

Thread.Sleep() lässt bei dir den UI-Thread schlafen. Kannst du deine Verarbeitung und deine Wartezeit eventuell in einem eigenen Thread auslagern? So bleibt der UI-Thread konstant aktiv und nur die Verarbeitung schläft.

Eventuell hilft Multi-Threading hier.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Gast
Du kommentierst als Gast. Wenn du bereits einen Account hast kannst du dich hier anmelden.
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoticons maximum are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor