ASP.NET Race Условия - PullRequest
       28

ASP.NET Race Условия

2 голосов
/ 10 апреля 2011

Каков наилучший способ предотвратить одновременное выполнение двумя разными людьми одного и того же метода? Например, пользователь A находится на той же странице, что и пользователь B. Оба одновременно нажимают кнопку на странице, выполняя код для этого события. Я пытаюсь заставить одного ждать, пока другой закончит.

Есть ли общий способ сделать это?

Вот еще немного информации ..

Это для простой игры, где вы покупаете участников сайта (например, игра Owned на FB). Строка запроса - это идентификатор пользователя. У меня проблема, когда два человека нажимают кнопку «Купить» одновременно. Один получает пользователя, а другой просто теряет деньги. Поэтому я пытаюсь предотвратить покупку в одно и то же время, чтобы не допустить этого.

Ответы [ 2 ]

5 голосов
/ 10 апреля 2011

A Page экземпляр будет создаваться для каждого запроса, поэтому при условии, что ваша логика находится в элементе экземпляра и не имеет доступа ни к чему общему, блокировка не требуется.

При обращении к общему ресурсу есть несколько способов принудительной блокировки. Одним из способов является использование оператора lock, например

private static someObject = new Object();

public void SomeMethod() 
{
    lock(someObject) 
    {
        // do something with your shared resource.
    }

}

Вообще говоря, вы должны стремиться избегать максимально возможного использования блокировок (хотя во многих случаях требуется блокировка).

EDIT:

Если вы храните свои данные в источнике данных, который поддерживает транзакции, например, как база данных, тогда вы сначала захотите проверить, что то, что пользователь пытается купить, еще не было куплено за время между нажатием кнопки «да» на странице и вашим приложением, получающим ответ. Итак, вам нужно проверить источник данных, чтобы увидеть, если он еще не был куплен, а если нет, то «купить» товар для пользователя. Это должно быть сделано внутри транзакции, чтобы она была атомарной, и поэтому вы берете деньги со счета пользователя только в том случае, если действие по «покупке» предмета выполнено успешно.

3 голосов
/ 10 апреля 2011

Вы можете украсить его атрибутом [MethodImpl]:

[MethodImpl(MethodImplOptions.Synchronized)]
public static void SomeMethod()
{
    ...
}

Таким образом, только один поток может выполнить метод, а другие будут ждать. Это эквивалентно помещению lock во все тело метода.

...