2013-03-25 54 views
0

我在我的任务管理器中注意到我有这个应用程序的几个副本 - 虽然没有任何CPU资源。我如何正确地在C#中退出/停止/处置控制台应用程序

我知道我必须做一些错误的,所以我想请问集体...

这里是无菌代码

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); 
      } 
     } 
    } 
} 
} 

我有其他的控制台应用程序是不是互斥/单是展出同样的行为,我做错了什么?我假设某种类型的处置......

感谢

+3

为什么你在那里有'GC.KeepAlive(互斥体)'? – feralin 2013-03-25 16:20:19

+0

我将你的代码复制并粘贴到Visual Studio中,并用长'Thread.Sleep(100000)'代替''Do Stuff''行。它按预期工作,只有一个应用程序实例正在运行。你能发布可以复制问题的代码,以及关于你的环境的更多信息吗? – 2013-03-25 16:29:14

+0

我见过的,然后用过的例子有GC.KeepAlive(互斥体); 这是错的吗? – 2013-03-25 16:59:09

回答

0

控制台应用程序只会在完成时终止,通常当它运行到其入口点方法的末尾时,尽管您必须小心摆脱您可能已经管理的任何挥之不去的资源,因为它们可以保留潜在的流程仍然存在。

您可以使用Environment.ExitApplication.Exit明确退出,但后者基于我的经验(与清除消息泵和关闭窗口等有关)是基于表单的。

底线是一定要做家务。

+0

挥之不去的资源 - 就像数据库连接一样?我现在正在研究这个问题。 – 2013-03-25 17:04:49

+0

@BuddyMurphy精确 - 类似的东西;确保你在IDisposables上调用Dispose。 – 2013-03-25 18:16:33

0
Application.Exit(); 

是标准的做法,但是,除非你正在寻找退出通过用户输入(例如应用程序。是否要退出程序(y/n)?),关闭控制台应该足够了。

+0

我有一种感觉,问题是关于正确地配置资源...... – feralin 2013-03-25 16:21:31

+0

@feralin我认为你是正确的,数据库连接没有正确释放。 – 2013-03-25 17:09:35

+0

那么application.exit会在这里作为一个catch吗?关于数据库,连接将被挂起直到数据库服务器计时,但那不是我想的问题。无论如何,如果application.exit由于某种原因不起作用,Environment.Exit(0)是更极端的形式,有点像kill命令。 – RandomUs1r 2013-03-25 17:49:30

0

您可以尝试在Mutex的使用周围添加using声明。例如:

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

这将自动处置Mutex实例的时大括号内的代码退出以任何方式(正常执行,或异常)。

相关问题