AddScoped DI и потокобезопасностьC#

Место общения программистов C#
Ответить
Anonymous
 AddScoped DI и потокобезопасность

Сообщение Anonymous »

Я пытаюсь понять, что именно происходит с AddScoped после разговора с коллегой. Я всегда считал, что AddScoped создает новый экземпляр класса менеджера в сервисе для каждого запроса. Мой коллега говорит мне, что даже если есть новый экземпляр класса, он все равно не является потокобезопасным, поскольку эти экземпляры могут находиться в одном потоке.
Интерфейс

Код: Выделить всё

public interface IManager
{
string AuthValue { get; set; }
Task DoSomethingAsync();
Task DoSomethingElseAsync();
}
Менеджер

Код: Выделить всё

public class Manager : IManager
{
protected string _AuthValue;

string IManager.AuthValue { get => _AuthValue; set => _AuthValue = value; }

public async Task DoSomethingAsync()
{
bool result = false;
///somecode that could take a few seconds to run
if (_AuthValue == "123")
{
result = true;
}

return result;
}

public async Task DoSomethingElseAsync()
{
bool result = false;
///somecode that could take a few seconds to run
if (_AuthValue == "456")
{
result = true;
}

return result;
}
}
program.cs

Код: Выделить всё

builder.Services.AddScoped();
var app = builder.Build();
Сервис

Код: Выделить всё

private readonly ILogger _logger;
private IManager _manager;
public MyService(ILogger logger, IManager manager)
{
_logger = logger;
_manager = manager;
}

public override Task SayHello(HelloRequest request, ServerCallContext context)
{
_manager.AuthValue = context.RequestHeaders.GetValue("Auth");
_manager.DoSomethingAsync();
}

public override Task SayHelloAgain(HelloRequest request, ServerCallContext context)
{
_manager.AuthValue = context.RequestHeaders.GetValue("Auth");
_manager.DoSomethingElseAsync();
}
Я не сторонник такого подхода, но я просто хочу лучше понять.

В моем колледже говорят, что когда поступает несколько одновременных запросов, потому что область действия может использовать один и тот же поток, есть вероятность, что когда поступает запрос на "SayHello" и начинается выполнение "DoSomethingAsync", если поступает новый запрос на "SayHelloAgain" с другим "AuthValue", в то время как "SayHello" в первый запрос все еще выполняется, и он потенциально обновит значение AuthValue для первого запроса, поскольку служба работает в том же потоке.

Я всегда понимал, что использование DI в качестве области действия означает, что каждый запрос разворачивается. новый экземпляр этого класса менеджера будет использоваться, чтобы подобные вещи не могли произойти. Если я ошибаюсь, не могли бы вы объяснить, как следует использовать добавление класса с ограниченной областью действия?
Я пробовал выполнять поиск несколько раз, даже попадая на первую страницу результатов. Кажется, все выглядит так, как я понимаю, но в моем сценарии не было ничего достаточно конкретного, чтобы подтвердить его.

Подробнее здесь: https://stackoverflow.com/questions/790 ... ead-safety
Ответить

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

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

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

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

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