1

我注意到在我的任务管理器中我有这个应用程序的几个副本 - 虽然不占用任何 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);
            }
        }
    }
}
}

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

谢谢

4

3 回答 3

2

控制台应用程序将在完成后终止,通常是在它运行到其Main入口点方法的末尾时,尽管您必须小心摆脱您可能一直在管理的任何挥之不去的资源,因为它们可以使底层进程保持活动状态。

您可以使用 显式退出Environment.ExitApplication.Exit尽管根据我的经验后者是基于表单的(与清除消息泵和关闭窗口等有关)。

底线是一定要做好家务。

于 2013-03-25T16:21:50.110 回答
1

您可以尝试添加using关于使用Mutex. 例子:

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

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

于 2013-03-25T16:21:06.887 回答
0
Application.Exit();

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

于 2013-03-25T16:21:00.493 回答