Laden...

Prozess bleibt bestehen nach return; in Main()

Erstellt von esven vor 15 Jahren Letzter Beitrag vor 15 Jahren 951 Views
esven Themenstarter:in
40 Beiträge seit 2006
vor 15 Jahren
Prozess bleibt bestehen nach return; in Main()

Hallo Liebe C#-Gemeinde,

Ich habe derzeit ein größeres Problem mit meinem Code, obwohl alle Threads gestoppt werden, und die Main-Methode auch bis zum Punkt "return" am Ende kommt, bleibt der Prozess bestehen. Im Debug Mode zeigt er mir auch keine Aufrufliste oder sonstwas an.

Vielleicht entdeckt ja jemand einen Fehler?!

Hier die Program.cs:


using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.ServiceProcess;
using System.Threading;
using System.Windows.Forms;
using System.Text;

namespace dcc.LogFileCollector.LogCollectorService
{
static class Program
{
private static Mutex mutex;
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool AttachConsole(int ProcessId);

[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool AllocConsole();

[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool FreeConsole();

/// <summary>
/// Der Haupteinstiegspunkt für die Anwendung.
/// </summary>
[STAThread]
static void Main(string[] args)
{
if (!IsApplicationStarted())
{
if (args.Length > 0)
{
if (args[0].Equals("config";))
{
Application.Run(new LogFileCollectorSettings());
}
else if (args[0].Equals("service";))
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new LogCollectorService()
};
ServiceBase.Run(ServicesToRun);
}
else
{
if (!AttachConsole(-1))
AllocConsole();
Console.WriteLine("Usage: " + Application.ExecutablePath.Substring(Application.ExecutablePath.LastIndexOf('\\')+1) + " [config|service]";);
FreeConsole();
}
}
else
{
if (!AttachConsole(-1))
AllocConsole();
Console.WriteLine("Starting TestCollector";);
try
{
TestCollector tc = new TestCollector();
}
catch (Exception e)
{
Console.WriteLine("Error: " + e.Message + "\n StackTrace: " + e.StackTrace);
}
FreeConsole();
}
}
else
{
if (!AttachConsole(-1))
AllocConsole();
Console.WriteLine("Only one instance of this application is allowed.\nPlease stop the service and try again.";);
FreeConsole();
}
return;
}

public static bool IsApplicationStarted()
{
string mutexName = Application.ProductName;
mutex = new Mutex(false, mutexName);
if (mutex.WaitOne(0, true))
return false;
else
return true;
}
}
}

Cäsar machte das Lager voll und jeder stand stramm bei seinem Haufen.

Gelöschter Account
vor 15 Jahren

debugge und schau dir die threadliste an. irgendwo existiert noc ein thread, der entweder wartet oder läuft.

esven Themenstarter:in
40 Beiträge seit 2006
vor 15 Jahren

Hi JAck30lena,

danke für die schnelle Antwort.

In der Threadliste sehe ich keine Threads, aber der Prozess bleibt weiterhin bestehen. Muss ich was bestimmtes machen, damit ich Threads in der Liste sehe?

Gruß

Cäsar machte das Lager voll und jeder stand stramm bei seinem Haufen.

P
67 Beiträge seit 2008
vor 15 Jahren

Muss man ein Mutex nicht wieder releasen damit der Thread beendet wird?

Religionskriege sind Konflikte zwischen erwachsenen Menschen, bei denen es darum geht, wer den cooleren, imaginaeren Freund hat

esven Themenstarter:in
40 Beiträge seit 2006
vor 15 Jahren

Ein

mutex.ReleaseMutex();

hat leider nicht geholfen.

Cäsar machte das Lager voll und jeder stand stramm bei seinem Haufen.

esven Themenstarter:in
40 Beiträge seit 2006
vor 15 Jahren

Okay, also das Problem ist gefunden und gelöst.

Ich wusste nicht, dass man Haltepunkte setzen muss um die Threads zu sehen.
Es war noch ein Thread da, der die SFTP-Verbindung offen hielt. Dieser wird jetzt immer richtig geschlossen und schon beendet sich der Prozess.

Allen antwortenden vielen dank für die Hilfe.

Cäsar machte das Lager voll und jeder stand stramm bei seinem Haufen.

3.971 Beiträge seit 2006
vor 15 Jahren

Sowas kannst du auch lösen, wenn du statt Threads ThreadPool verwendest, die entsprechenden asynchronen Funktionen von Klassen oder aber beim Erstellen des Threads die IsBackground-Eigenschaft auf true setzt.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...