2010-04-09 2 views
0

Для нашего старшего проекта проекта моя группа создает приложение 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. Одно из решений заключалось бы в том, чтобы заставить наши вызовы на фронт делать синхронно. И на самом деле, когда мы делаем это, все работает нормально, поэтому логика кода не нарушается. Но когда оно будет запущено, наше приложение будет развернуто в рамках бизнеса и будет использоваться внутренним ИТ-персоналом (или, по крайней мере, это план), поэтому у нас будет та же проблема. Мы не можем заставить всех клиентов отправлять данные в разное время, поэтому нам действительно нужно синхронизировать их на задней панели. Спасибо за любую помощь, которую вы можете дать, я был бы рад предоставить любую дополнительную информацию, которая вам понадобится!

+0

@ Эрик: вы добавляете теги C# и .net слишком широкую аудиторию, единственным тегом, который является совершенно определенным, является Silverlight. Однако ваш вопрос очень мало связан с Silverlight. Подумайте о том, чтобы добавить теги, более релевантные вашему вопросу, чтобы привлечь внимание к тем, кто с большей вероятностью сможет помочь. – AnthonyWJones

ответ

0

я написал серию конкретно рассмотреть эту ситуацию - дайте мне знать, если это работает для вас (последовательные асинхронные рабочие процессы):

Часть 2 (имеет обратную ссылку на часть1): http://csharperimage.jeremylikness.com/2010/03/sequential-asynchronous-workflows-part.html

Jeremy

+0

Эй, спасибо за ссылку, но я думаю, что вы - статьи, которые атакуют проблему с передней стороны, где нам действительно нужно решить эту проблему на заднем плане. Мы можем настроить наш метод add_data, чтобы сделать асинхронные вызовы последовательно, но это решает только эту часть проблемы. Нам действительно нужен задний конец, чтобы обрабатывать все вызовы asyc разумно, чтобы несколько пользователей, действующих в одно и то же время, не вызывали потери целостности данных. Кого мы не можем достичь с помощью кода на стороне клиента. Вот почему мы попытались использовать семафоры, и мы действительно надеемся, что там есть простое решение. Спасибо за ваш ответ! –

0

Оберните обновления своей базы данных в транзакции. При необходимости перейдите на стоп-столик

Смежные вопросы