Интерфейс
Код: Выделить всё
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;
}
}
Код: Выделить всё
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
Мобильная версия