C# 如何在C中正确退出/停止/处置控制台应用程序#

C# 如何在C中正确退出/停止/处置控制台应用程序#,c#,console-application,C#,Console Application,我注意到,在我的任务管理器中,我有几个应用程序的副本——尽管没有占用任何CPU资源 我知道我一定做错了什么,所以我问集体 这是经过消毒的密码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Diagnostics; namespace AnalyticsAggregator { class Prog

我注意到,在我的任务管理器中,我有几个应用程序的副本——尽管没有占用任何CPU资源

我知道我一定做错了什么,所以我问集体

这是经过消毒的密码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Diagnostics;

namespace AnalyticsAggregator
{
class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        try
        {
            bool onlyInstance = false;
            Mutex mutex = new Mutex(true, "AnalyticsAggregator", out onlyInstance);
            if (!onlyInstance)
            {
                return;
            }

                            "Do stuff with the database"


            GC.KeepAlive(mutex);
        }
        catch (Exception e)
        {

                EventLog eventlog = new EventLog("Application");
                eventlog.Source = "AnalyticsAggregator";
                eventlog.WriteEntry(e.Message, EventLogEntryType.Error);
            }
        }
    }
}
}
我有其他不是互斥/单例的控制台应用程序,它们表现出相同的行为,我做错了什么?我假设某种类型的处置

谢谢


是标准方法,但是,除非您希望通过用户输入退出应用程序(例如,是否要退出应用程序(y/n)),否则关闭控制台就足够了。

您可以尝试在使用
互斥体时使用
语句添加
。例如:

using (Mutex mutex = new Mutex(true, "AnalyticsAggregator", out onlyInstance))
{
    if (!onlyInstance) return;
    ... database stuff ...
}

当花括号内的代码以任何方式退出(正常执行或异常)时,这将自动处理互斥锁实例。

控制台应用程序将在完成时终止,通常是在运行到其
入口点方法的末尾时,尽管您必须小心地清除可能一直在管理的任何延迟资源,因为它们可以使底层流程保持活力

您可以使用
Environment.exit
,也可以使用
Application.exit
明确退出,尽管后者是基于我的经验(与清除消息泵和关闭窗口等相关)形成的


底线是一定要做内务处理。

为什么在那里有
GC.KeepAlive(互斥)
?我复制并粘贴了你的代码到Visual Studio中,并用一个长
线程替换了
“do Stuff”
行。Sleep(100000)
。它按预期工作,只运行应用程序的一个实例。你能发布代码来重现问题吗,以及关于你的环境的更多信息吗?我看到的例子,然后使用的例子,有GC.KeepAlive(互斥);这是错误的吗?在
GC.KeepAlive(object)
()的MSDN文档中,似乎只有在调用可能挂起指定对象的非托管代码时才应该使用它。您是否在“使用数据库执行任务”代码中使用任何COM代码或非托管DLL?@feralin不,仅使用TableAdapter调用。我们目前使用TableAdapters作为我们的DAL.Deling资源-比如DB连接?“我现在正在调查这件事。”巴迪墨菲说得很对——大概是这样的;请确保在IDisPoables上调用Dispose。@feralin我认为您是正确的,数据库连接没有被正确释放。那么application.exit在这里不是一个包罗万象的工具吗?关于数据库,连接将一直挂起,直到数据库服务器计时,但这不是我想的问题。无论如何,如果application.exit由于某种原因无法工作,Environment.exit(0)是更极端的形式,有点像kill命令。
using (Mutex mutex = new Mutex(true, "AnalyticsAggregator", out onlyInstance))
{
    if (!onlyInstance) return;
    ... database stuff ...
}