.Net Core - как определить, работает ли приложение? [Дубликат]

Получено из ответа Esailija с исправлениями для поддержки нескольких ключей верхнего уровня.

(function () {
    function parseDotNotation(str, val, obj) {
        var currentObj = obj,
            keys = str.split("."),
            i, l = Math.max(1, keys.length - 1),
            key;

        for (i = 0; i < l; ++i) {
            key = keys[i];
            currentObj[key] = currentObj[key] || {};
            currentObj = currentObj[key];
        }

        currentObj[keys[i]] = val;
        delete obj[str];
    }

    Object.expand = function (obj) {
        for (var key in obj) {
            if (key.indexOf(".") !== -1)
            {
                parseDotNotation(key, obj[key], obj);
            }            
        }
        return obj;
    };

})();

var obj = {
    "pizza": "that",
    "this.other": "that",
    "alphabets": [1, 2, 3, 4],
    "this.thing.that": "this"
}

Выходы:

{
    "pizza": "that",
    "alphabets": [
        1,
        2,
        3,
        4
    ],
    "this": {
        "other": "that",
        "thing": {
            "that": "this"
        }
    }
}

Fiddle

21
задан blitzkriegz 4 May 2009 в 12:55
поделиться

7 ответов

Я сделал это один раз, надеюсь, это поможет:

bool createdNew;

Mutex m = new Mutex(true, "myApp", out createdNew);

if (!createdNew)
{
    // myApp is already running...
    MessageBox.Show("myApp is already running!", "Multiple Instances");
    return;
}
11
ответ дан Peter D 29 August 2018 в 01:20
поделиться
  • 1
    Этот код не является безопасным или правильным: stackoverflow.com/questions/229565/… – Sam Saffron 4 May 2009 в 13:56
  • 2
    Я бы хотел, чтобы это было безопасно и правильно. Это очень просто и легко может быть написано без всякой мысли вообще. +1 к вам обоим. – jay_t55 18 June 2013 в 10:31
  • 3
    Этот код работает в коде отладки, но не в выпуске exe !!! – Rajeev Kumar 21 May 2014 в 13:42
  • 4
    @SamSaffron - Вы говорите, что это небезопасно и некорректно только в сценариях, где мьютексы могут запрашиваться несколькими пользователями. Или это небезопасно и неправильно в сценариях, где мьютекс будет запрашиваться только одним пользователем? – dugas 19 December 2014 в 20:50
  • 5
    Я не согласен с комментарием Сэма (и downvotes). Код не использует синхронизацию мьютекса. Вместо этого мьютекс используется только для определения того, был ли уже создан другим процессом и будет уничтожен, когда процесс завершится, включая аномальное завершение. Я сочту это безопасным и правильным, пока не увижу объяснение, почему это было бы неправильно. Проблемы могут быть мошенническим приложением, захватывающим мьютекс, и процесс, выполняемый дважды в разных сеансах. Первый - саботаж, второй - вопросом (« пользователь пытается открыть приложение второй раз»). – Paul B. 31 May 2018 в 17:22

Я использую это:

    private static Mutex _mutex;

    private static bool IsSingleInstance()
    {
        _mutex = new Mutex(false, _mutexName);

        // keep the mutex reference alive until the normal 
        //termination of the program
        GC.KeepAlive(_mutex);

        try
        {
            return _mutex.WaitOne(0, false);
        }
        catch (AbandonedMutexException)
        {
            // if one thread acquires a Mutex object 
            //that another thread has abandoned 
            //by exiting without releasing it

            _mutex.ReleaseMutex();
            return _mutex.WaitOne(0, false);
        }
    }


    public Form1()
    {
        if (!isSingleInstance())
        {
            MessageBox.Show("Instance already running");
            this.Close();
            return;
        }

        //program body here
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (_mutex != null)
        {
            _mutex.ReleaseMutex();
        }
    }    
3
ответ дан algreat 29 August 2018 в 01:20
поделиться

Проверьте код, показанный на на этой странице

. Короче говоря, вы используете перегрузку Mutex ctor(bool, string, out bool), которая сообщает вам через параметр out, независимо от того, получили ли вы право собственности на Именованный Mutex. Если вы первый экземпляр, этот параметр будет содержать true после вызова ctor - в этом случае вы будете продолжать, как обычно. Если этот параметр является ложным, это означает, что еще один экземпляр уже получил право собственности /, и в этом случае вы увидите сообщение об ошибке «Другой экземпляр уже запущен». а затем изящно выйти.

1
ответ дан Gishu 29 August 2018 в 01:20
поделиться
static void Main() 
{
  using(Mutex mutex = new Mutex(false, @"Global\" + appGuid))
  {
    if(!mutex.WaitOne(0, false))
    {
       MessageBox.Show("Instance already running");
       return;
    }

    GC.Collect();                
    Application.Run(new Form1());
  }
}

Источник: http://odetocode.com/Blogs/scott/archive/2004/08/20/401.aspx

7
ответ дан Milen 29 August 2018 в 01:20
поделиться
  • 1
    Этот код не является безопасным или правильным ... stackoverflow.com/questions/229565/… – Sam Saffron 4 May 2009 в 13:56
  • 2
    «Глобальный» делает его глобальным для машины, а не для пользователя. Таким образом, в серверной среде или через терминальные службы только один пользователь может запускать ее за раз. Я думаю, большинство пользователей ожидают, что один экземпляр будет означать для них один экземпляр. – Paul Alexander 31 August 2011 в 04:11

Используйте приложение с таймаутом и настройками безопасности. Я использовал свой собственный класс:

private class SingleAppMutexControl : IDisposable
    {
        private readonly Mutex _mutex;
        private readonly bool _hasHandle;

        public SingleAppMutexControl(string appGuid, int waitmillisecondsTimeout = 5000)
        {
            bool createdNew;
            var allowEveryoneRule = new MutexAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null),
                MutexRights.FullControl, AccessControlType.Allow);
            var securitySettings = new MutexSecurity();
            securitySettings.AddAccessRule(allowEveryoneRule);
            _mutex = new Mutex(false, "Global\\" + appGuid, out createdNew, securitySettings);
            _hasHandle = false;
            try
            {
                _hasHandle = _mutex.WaitOne(waitmillisecondsTimeout, false);
                if (_hasHandle == false)
                    throw new System.TimeoutException();
            }
            catch (AbandonedMutexException)
            {
                _hasHandle = true;
            }
        }

        public void Dispose()
        {
            if (_mutex != null)
            {
                if (_hasHandle)
                    _mutex.ReleaseMutex();
                _mutex.Dispose();
            }
        }
    }

и использовал его:

    private static void Main(string[] args)
    {
        try
        {
            const string appguid = "{xxxxxxxx-xxxxxxxx}";
            using (new SingleAppMutexControl(appguid))
            {

                Console.ReadLine();
            }
        }
        catch (System.TimeoutException)
        {
            Log.Warn("Application already runned");
        }
        catch (Exception ex)
        {
            Log.Fatal(ex, "Fatal Error on running");
        }
    }
1
ответ дан vivlav 29 August 2018 в 01:20
поделиться

Посмотрите на этот вопрос

Существует ссылка на эту статью: неверно понятый мьютекс , где объясняется использование мьютекса.

1
ответ дан Community 31 August 2018 в 07:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: