Я просто хочу сделать простое, хотя ориентированный на многопотоковое исполнение, булев тест (и установите), так:
if(myBoolean==false) //should not lock/wait!
{
myBoolean=true;
.....
}
else
{
....
}
Я рассмотрел следующее (хотя возможно неправильно, поэтому исправьте меня, где я неправильно понял),
У кого-либо есть идея, что класс/конструкция должен сделать это эффективным способом?
Ответ ( intelocked.compareexchange
) уже был дан, но вот пример моего использования:
private int _isDisposing;
public bool IsDisposing
{
get
{
return this._isDisposing != 0;
}
}
public void Dispose()
{
// Side note: I may want to `return` instead of `throw`
if (Interlocked.CompareExchange(ref _isDisposing, 1, 0) != 0)
throw new InvalidOperationException("Dispose was recursively called.");
try
{
Dispose(true);
GC.SuppressFinalize(this);
}
finally
{
_isDisposing = 0;
}
}
ASP.net запускается на сервере - он просто генерирует HTML (& JavaScript), который отправляется клиенту (например, браузеру) и визуализируется там.
Так что вам нужно не asp.net решение, а действительно богатое клиентское решение. Некоторые из ваших вариантов:
Я подозреваю, что Javascript или Silverlight будут представлять для вас наибольший интерес. Возможно, вы хотите провести небольшое расследование и вернуться с обновленным вопросом.
UPDATE Re: Bob's Comment:
Быстрый google нашел это, что кажется довольно классным:
Облегченные визуальные тезаурасы
-121--4244800- Также имейте в виду, что реализация вашего приложения с помощью нескольких действий
даст пользователю более согласованный опыт работы с платформой Часть опыта будет формироваться с помощью встроенных приложений Google, поэтому пользователям, вероятно, будет легче использовать ваше приложение, если оно будет вести себя аналогично тем, которые уже установлены на телефоне.
Ваш вопрос несколько неоднозначен, но вы, вероятно, ищете класс Blocked
.
EDIT : Требуется Interlocked.CompeyExchange
.
Чтобы иметь резьбовую безопасную тест и установить операцию, код должен заблокировать другие потоки. Чтобы избежать блокировки нецелесообразных, вы можете использовать шаблон Test-and-Test-and-Set:
if (something) {
lock(_sync) {
if (something) {
something = false;
...
}
}
}
Второй тест должен быть уверен, что какой-то другой нить не изменил значение между первым тестом и блокировкой.