Это может быть чем-то вроде излишества, но MythTV является абсолютно невероятно потрясающей вещью:
существует отдельное распределение Ubuntu, названной установка Mythbuntu, которая имела бы смысл, если Вы создаете специализированный медиацентр, но можно также установить MythTV в "нормальной" Ubuntu
Компилятор 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;
}
}
Как видите,
Я считаю, что IL будет идентичным ... Мне пришлось бы проверить это, чтобы быть уверенным, но оператор блокировки, наконец, генерирует попытку в IL, и возврат вызовет наконец (с выпуском) ДО того, как кадр стека закроется и все равно вернется к вызывающему, так что ...
Да, но почему бы не использовать Dequeue?
Помните, что блокировка - это просто сокращение для чего-то вроде:
try
{
Monitor.Enter(QueueModifierLockObject);
DownloadFile toReturn = queue.Dequeue();
return toReturn;
}
finally
{
Monitor.Exit(QueueModifierLockObject);
}