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.
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.
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
Ein
mutex.ReleaseMutex();
hat leider nicht geholfen.
Cäsar machte das Lager voll und jeder stand stramm bei seinem Haufen.
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.
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...