Почему .net решил разоблачить оба .wait () и .waitasync () на SemaphoreslimC#

Место общения программистов C#
Ответить
Anonymous
 Почему .net решил разоблачить оба .wait () и .waitasync () на Semaphoreslim

Сообщение Anonymous »

Semaphoreslim выставляет wait () и waitasync () . Почему они решили это сделать? Представьте, что я защищаю поля в классе. Этот класс обладает некоторыми свойствами (синхронными), как некоторые асинхронные методы.
Мы думаем, что этот вид класса-плохая идея по дизайну, как единственный способ защиты полей от доступа к нескольким темам, который мы хотим, чтобы мы могли защищать, и используют доступ к полету и используются поля. в том же положении, к которому обращаются из асинхровых методов. Тогда у нас будет тупик. Итак, нам было интересно, какова цель Semaphoreslim , придерживаясь синхронного метода ожидания для начала? /> Если программисту нужно защитить что -то вне асинхронного контекста, то он может просто использовать Semaphore.wait () < /code> (таким образом, не < /strong> semaphoreslim). < /p>
Разве это не супер путает /не опасно создать иллюзию, что «ОК». Псевдо -код < /p>
public class SomeClass
{
private readonly SemaphoreSlim _semaphore = new(initialCount: 1);

private List _someList = new();

public bool SomeProperty
{
get
{
// If this is called from "task2" scheduled on native thread "1".
// While "task1" is scheduled out while having the semaphore,
// and also executed on thread "1".
_semaphore.Wait();
try
{
return _someList.Any();
}
finally
{
_semaphore.Release();
}
}
}

public async Task AddToListAsync(object item)
{
await _semaphore.WaitAsync().ConfigureAwait(false);
try
{
_someList.Add(item);
// Allow to schedule out the current task
await Task.Delay(0).ConfigureAwait(false);
return true;
}
finally
{
_semaphore.Release();
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/796 ... aphoreslim
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»