Для нашего старшего проекта проекта моя группа создает приложение Silverlight, которое использует концепции теории графов и сохраняет данные в базе данных на задней панели. У нас есть ситуация, когда мы добавляем связь между двумя узлами в графе, и при этом мы запускаем анализ, чтобы повторно классифицировать наши кластеры узлов. Проблема в том, что эта повторная категоризация довольно сложна и включает в себя несколько запросов и обновлений для базы данных, поэтому, если сразу несколько экземпляров запускаются, она быстро искажает данные и разбивает их (путем повторной установки уже используемых первичных ключей). По сути, это не потокобезопасность, и мы пытаемся сделать это безопасным, и именно здесь мы терпим неудачу и нуждаемся в помощи :).Синхронизация асинхронных обработчиков запросов в среде Silverlight
функцию Создать ссылку выглядит следующим образом:
private Semaphore dblock = new Semaphore(1, 1);
// This function is on our service reference and gets called
// by the client code.
public int addNeed(int nodeOne, int nodeTwo)
{
dblock.WaitOne();
submitNewNeed(createNewNeed(nodeOne, nodeTwo));
verifyClusters(nodeOne, nodeTwo);
dblock.Release();
return 0;
}
private void verifyClusters(int nodeOne, int nodeTwo)
{
// Run analysis of nodeOne and nodeTwo in graph
}
Все копии addNeed должны ждать первого, который приходит, чтобы закончить до другой может выполнить. Но вместо этого все они, похоже, работают и конфликтуют друг с другом в методе verifyClusters. Одно из решений заключалось бы в том, чтобы заставить наши вызовы на фронт делать синхронно. И на самом деле, когда мы делаем это, все работает нормально, поэтому логика кода не нарушается. Но когда оно будет запущено, наше приложение будет развернуто в рамках бизнеса и будет использоваться внутренним ИТ-персоналом (или, по крайней мере, это план), поэтому у нас будет та же проблема. Мы не можем заставить всех клиентов отправлять данные в разное время, поэтому нам действительно нужно синхронизировать их на задней панели. Спасибо за любую помощь, которую вы можете дать, я был бы рад предоставить любую дополнительную информацию, которая вам понадобится!
@ Эрик: вы добавляете теги C# и .net слишком широкую аудиторию, единственным тегом, который является совершенно определенным, является Silverlight. Однако ваш вопрос очень мало связан с Silverlight. Подумайте о том, чтобы добавить теги, более релевантные вашему вопросу, чтобы привлечь внимание к тем, кто с большей вероятностью сможет помочь. – AnthonyWJones