Вы находитесь на неправильном конце Межтрубы. Это - сервер, который может иметь только один конкретный открытый порт. Некоторый код:
IPAddress ipAddress = Dns.GetHostEntry("localhost").AddressList[0];
try {
TcpListener tcpListener = new TcpListener(ipAddress, 666);
tcpListener.Start();
}
catch (SocketException ex) {
MessageBox.Show(ex.Message, "kaboom");
}
Сбои с:
Только одно использование каждого адреса сокета (адрес/порт протокола/сети) обычно разрешается.
From sp_getapplock
Блокировки, связанные с текущим транзакция выпущена, когда транзакция фиксируется или откатывается.
Итак, это не нужно, потому что вы откатываетесь.
Однако, если вы хотите быть в безопасности, я сделаю это после блока CATCH и сначала протестирую с помощью APPLOCK_TEST . Обычно это будет блок НАКОНЕЦ, которого у нас нет.
Я бы поставил его здесь, чтобы он всегда выполнялся. Если сеанс продолжается или пул соединений поддерживает его в рабочем состоянии (неужели? Забудьте прямо сейчас), тогда вы полагаетесь на COMMIT / ROLLBACK, если это было не непосредственно перед выходом. Конечно, все, что пропускает блок CATCH, в любом случае будет серьезной ошибкой прерывания ...
Если вы откатываете транзакцию, нет необходимости снимать блокировку приложения в вашем захвате.
Из http://msdn.microsoft.com/en-us /library/ms189823.aspx:
Блокировки, размещенные на ресурсе, связаны либо с текущим транзакция или текущий сеанс. Блокировки, связанные с текущей транзакцией, снимаются, когда транзакция фиксируется или откатывается. Блокировки, связанные с сеансом: освобождается, когда сеанс регистрируется вне. Когда сервер выключается на по любой причине все блокировки снимаются.