Как заблокировать ресурс при использовании BeginInvoke для многопоточности? - PullRequest
0 голосов
/ 12 января 2012

У меня есть один метод, который анализирует некоторые данные, принадлежащие определенному пользователю, и сохраняет их в базе данных.

delegate void parseUserDataDelegate(string pathToFile);

Я создал для него делегат и рендеринг с BeginInvoke для параллельной обработки.

parseUserDataDelegate deleg = new parseUserData(this.parseUserData);
IAsyncResult result = deleg.BeginInvoke(path, null, null);
deleg.EndInvoke(result);

Проблема состоит в том, что есть две таблицы - одна для данных, где внешний ключ является идентификатором пользователя, и другая таблица для пользователя.Если при анализе нет соответствующего пользователя, метод добавляет новую запись в пользовательскую таблицу и использует ее идентификатор.В одной таблице данных содержится около 100 записей для одного пользователя.Проблема заключается в том, что при обработке всех данных первого пользователя возникает ошибка, поскольку два потока пытаются создать одну и ту же запись для второго пользователя.Как заблокировать доступ к пользовательской таблице для разных потоков?

1 Ответ

0 голосов
/ 12 января 2012

В зависимости от вашего кода.Я бы предложил место, где метод поиска пользователя и, возможно, создания нового пользователя заключен в блок блокировки.

lock(NewUserSync)
{
  FooBar();
}

, где NewUserSync - простой объект, общий для этих рабочих потоков.Если код синтаксического анализа находится в классе, то он создается в ctor (до запуска метода в нескольких потоках).Идентификаторы пользователя могут быть, конечно, кэшированы в некотором общем объекте (требуется безопасность потока).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...