Это нормальное поведение. Вы используете петлевой IP-адрес для сетевых коммуникаций между приложением UWP и другим процессом (другим приложением UWP или настольным приложением). Это ограничено изоляцией сети.
Вы можете запустить свой сервер и клиент на другом компьютере для тестирования. См. Документ Как включить обратную связь и устранить проблемы изоляции сети (приложения Windows Runtime) . Он объяснил этот сценарий:
Loopback разрешен только для целей разработки. Использование приложением среды выполнения Windows, установленным вне Visual Studio, не допускается. Кроме того, приложение среды выполнения Windows может использовать петлю IP-адреса только в качестве целевого адреса для запроса клиентской сети. Поэтому приложение времени выполнения Windows, которое использует DatagramSocket или StreamSocketListener для прослушивания IP-адреса обратной связи, не получает никаких входящих пакетов.
blockquote>В вашем случае, если вы просто хотите проверить, может ли приложение UWP успешно отправить сообщение вашему подписчику Python. Вы можете запустить приложение UWP на другом компьютере. Я использовал ваш код для создания приложения UWP для отправки сообщения и создания консольного приложения в качестве подписчика, которое запускается на другом компьютере. Консольное приложение может получить сообщение.
Обратите внимание, что поскольку вашему приложению UWP требуется доступ к сети во время выполнения, вам необходимо включить возможности Netwrok (
Internet(Client)
Internet(Client & Server)
Private Networks(Client & Server)
) в файле Package.appxmanifest.
Интересно - вы пытаетесь создать вектор
или список
неполного типа. Беглый взгляд на стандарт, я не могу найти ничего, говорящего о том, разрешено это или не должно быть разрешено для типов контейнеров, включенных в стандартную библиотеку C ++. Любое решение могло бы показаться разумным:
Почему это может быть запрещено: Вы не можете объявить объект типа X
внутри определения X
.
Например, следующий код не может быть скомпилирован, потому что он создает бесконечно глубокую структуру данных:
struct X {
X x;
};
Почему это может быть разрешено: Размер большинства контейнеров можно изменять, что требует определенного уровня косвенности (указатели) на фактические элементы данных на практике. Это' s законно объявить указатель на- X
внутри определения X
.
Как следует из последнего абзаца, обычный способ обойти эту проблему - использовать указатели или ссылки на X
. Например, следующие два фрагмента компилируются нормально:
struct Y {
Y* y;
};
struct Z {
std::list<Z*> zl;
std::vector<Z*> zv;
};
Кто-нибудь (хорошо, я имею в виду litb :-P) знает, каковы на самом деле требования к стандартным типам контейнеров?
com / kb / q169960 / )Также вы можете посмотреть в Google, как получить информацию о трассировке тупиковых ситуаций (флаг трассировки 1222) - это даст отчет о том, какие операторы SQL конфликтуют из-за каких объектов каждый раз возникает тупик. Это довольно приличная статья - http://blogs.msdn.com/bartd/archive/2006/09/09/747119.aspx
Чтения все еще могут вызывать блокировки, чтобы БД гарантировала, что запись не будет сделана в середине неатмического чтения. Другими словами, блокировка чтения гарантирует, что вы получите точный согласованный снимок любых данных, которые вы выбираете.
У вас такое же поведение с adOpenForwardOnly
?
Возможно, вы захотите проверить актуальность статистики вашего SQL Server. Или вы можете попросить администратора базы данных перестроить все индексы. Многие проблемы с блокировкой возникают из-за устаревшей статистики / индексов.
Это зависит от поведения обоих приложений. ваше приложение наверняка может дождаться освобождения ресурсов другим.
Тупик - это состояние, при котором два или более процесса ждут друг друга, чтобы освободить ресурс, или более двух процессов ожидают ресурсов в кольцевой цепочке. Конечно, вы можете создать тупик с доступом только для чтения, потому что чтение НЕ будет ждать.
Разве это не будет примерно так?
Другое приложение : запись в таблицу (получение блокировки записи в таблице)
Ваше приложение : чтение из таблицы (получить блокировку чтения таблицы, невозможно из-за блокировки записи).
Я думаю, что в уже предоставленных здесь ответах есть несколько возможностей. Поскольку вы принимаете только разделяемые блокировки, взаимоблокировка не может быть связана с эскалацией блокировок, а должна просто иметь блокировки, несовместимые с блокировками, полученными в другом процессе, и получение этих блокировок в другом порядке ...
Ваши общие блокировки блокировки несовместимы с другим процессом, принимающим монопольные блокировки. Сценарий может выглядеть примерно так ...
NB. В тупиковых ситуациях может участвовать больше игроков, чем просто 2. Иногда возникает целая цепочка взаимосвязанных действий, которая приводит к тупику, но принцип тот же.
Часто, если несколько приложений обращаются к одной и той же базе данных, там - администратор баз данных, который управляет всем доступом через хранимые процедуры, поэтому он может гарантировать, что ресурсы всегда заблокированы в одном и том же порядке. Если ты' re не в такой ситуации, и другие приложения используют специальные операторы SQL, вам нужно будет проверить их код, чтобы выяснить, могут ли они конфликтовать с вашим приложением, как я описал. Звучит не очень весело.
Прагматическим решением может быть обнаружение ошибки, когда ваша транзакция прекращается как жертва тупиковой ситуации, и просто повторная попытка транзакции несколько раз. В зависимости от того, какую активность генерируют другие приложения, таким образом можно добиться приемлемых результатов.
и просто повторите попытку транзакции несколько раз. В зависимости от того, какую активность генерируют другие приложения, таким образом можно добиться приемлемых результатов. и просто повторите попытку транзакции несколько раз. В зависимости от того, какую активность генерируют другие приложения, таким образом можно добиться приемлемых результатов.