Как реализовать одноэлементный шаблон с бесконечным циклом - C # - PullRequest
3 голосов
/ 25 января 2010

В настоящее время я работаю над приложением в C #, которое выполняется по бесконечному циклу с вызовом Thread.Sleep после каждой итерации других вызовов метода. Мой главный -

static void Main(string[] args)
    {
        bool isOnlyInstance = false;
        Mutex mutex = new Mutex(true, "RiskMetricsSensitivitiesDatabaseLoader", out isOnlyInstance);

        if (!isOnlyInstance)
        {
            return;
        }

        while (true)
        {
            ProcessData();
            Thread.Sleep(MainLoopSleep);
        }

        GC.KeepAlive(mutex);
    }

Я вставил вызов KeepAlive в конце метода, чтобы гарантировать, что мьютекс-синглтон работает должным образом, как об этом говорили различные веб-сайты. Предполагается, что вызов KeepAlive не даст мусору убрать мьютекс, поскольку .NET с нетерпением ожидает возможности оптимизировать сборку мусора.

Мой вопрос таков: поскольку фактический вызов KeepAlive не достигается, должен ли я поместить его в цикл после Thread.Sleep? Компилятор предупреждает, что KeepAlive никогда не вызывается, и я обеспокоен тем, что поэтому он проигнорирует эту строку в моем алгоритме предотвращения сбора мусора.

Ответы [ 2 ]

10 голосов
/ 25 января 2010

Mutex одноразовый. Почему бы не обернуть его в using?

using(new Mutex(blah, blah, blah)){
    while(true){
        Blah(blah);
    }
}

Обратите внимание, что это работает даже без присвоения новой Mutex именованной переменной.

1 голос
/ 25 января 2010

С тобой должно быть все в порядке. Суть GC.KeepAlive заключается в том, что позже в функции есть ссылка на объект, и поэтому он никогда не удаляется. Фреймворк недостаточно умен, чтобы знать, что ваш цикл никогда не завершится, поэтому он никогда не удаляет объект.

...