C# 如何在C中正确退出/停止/处置控制台应用程序#
我注意到,在我的任务管理器中,我有几个应用程序的副本——尽管没有占用任何CPU资源 我知道我一定做错了什么,所以我问集体 这是经过消毒的密码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
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 ...
}