Я могу поместить оператор возврата в блокировке

Это может быть чем-то вроде излишества, но MythTV является абсолютно невероятно потрясающей вещью:

  • можно сказать это, после того как Вы хотите записать определенное шоу, и это найдет его и запишет его автоматически. Или записывать все документальные фильмы. Или записывать первый эпизод всех мыльных опер.
  • зарегистрированные эпизоды аккуратно категоризированы в хорошем UI
  • , который можно сказать этому сохранять только 10 последними эпизодами шоу
  • , что можно сказать этому находить блоки рекламы, таким образом, можно пропустить их (или возможно пропустить фильм и смотреть рекламу вместо этого)
  • , это имеет отдельный бэкенд, который работает в фоновом режиме, таким образом, Вы не должны вручную запускать ничего для записи программы
  • , можно даже настроить компьютер, чтобы проснуться ночью, записать шоу и закрыться. Или у Вас может быть бэкенд, работающий на одной машине, которая никогда не закрывается, и получите доступ к нему с несколькими frontends, установленными на всех Ваших домашних ПК.
  • можно настроить доступ к MythTV через веб-браузер, таким образом, можно справиться с записями по Интернету

MythTV

существует отдельное распределение Ubuntu, названной установка Mythbuntu, которая имела бы смысл, если Вы создаете специализированный медиацентр, но можно также установить MythTV в "нормальной" Ubuntu

15
задан Community 23 May 2017 в 12:10
поделиться

3 ответа

Компилятор C # переместит оператор return за пределы try / finally , созданного для блокировки заявление. Оба ваших примера идентичны с точки зрения IL, который компилятор будет генерировать для них.

Вот простой пример, доказывающий, что:

class Example
{
    static Object obj = new Object();

    static int Foo()
    {
        lock (obj)
        {
            Console.WriteLine("Foo");
            return 1;
        }
    }

    static int Bar()
    {
        lock (obj)
        {
            Console.WriteLine("Bar");
        }
        return 2;
    }
}

Приведенный выше код компилируется в следующее:

internal class Example
{
        private static object obj;

        static Example()
        {
                obj = new object();
                return;
        }

        public Example()
        {
                base..ctor();
                return;
        }

        private static int Bar()
        {
                int CS$1$0000;
                object CS$2$0001;
                Monitor.Enter(CS$2$0001 = obj);
        Label_000E:
                try
                {
                        Console.WriteLine("Bar");
                        goto Label_0025;
                }
                finally
                {
                Label_001D:
                        Monitor.Exit(CS$2$0001);
                }
        Label_0025:
                CS$1$0000 = 2;
        Label_002A:
                return CS$1$0000;
        }

        private static int Foo()
        {
                int CS$1$0000;
                object CS$2$0001;
                Monitor.Enter(CS$2$0001 = obj);
        Label_000E:
                try
                {
                        Console.WriteLine("Foo");
                        CS$1$0000 = 1;
                        goto Label_0026;
                }
                finally
                {
                Label_001E:
                        Monitor.Exit(CS$2$0001);
                }
        Label_0026:
                return CS$1$0000;
        }
}

Как видите,

25
ответ дан 1 December 2019 в 02:37
поделиться

Я считаю, что IL будет идентичным ... Мне пришлось бы проверить это, чтобы быть уверенным, но оператор блокировки, наконец, генерирует попытку в IL, и возврат вызовет наконец (с выпуском) ДО того, как кадр стека закроется и все равно вернется к вызывающему, так что ...

2
ответ дан 1 December 2019 в 02:37
поделиться

Да, но почему бы не использовать Dequeue?

Помните, что блокировка - это просто сокращение для чего-то вроде:

        try
        {
            Monitor.Enter(QueueModifierLockObject);

            DownloadFile toReturn = queue.Dequeue();         

            return toReturn;
        }
        finally
        {
            Monitor.Exit(QueueModifierLockObject);
        }
0
ответ дан 1 December 2019 в 02:37
поделиться
Другие вопросы по тегам:

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