Можно ли весь код поместить в один lock?
public class Worker
{
private readonly Dictionary<string, ManualResetEventSlim> _etpIdToReadyEventSlim = new();
private readonly DefaultRtsMarketWaiterSettings _settings = new();
public Task WaitProcedureAsync(Procedure procedure,
CancellationToken cancellationToken = default)
{
ManualResetEventSlim manualResetEventSlim;
lock (_etpIdToReadyEventSlim)
{
if (!_etpIdToReadyEventSlim.TryGetValue(procedure.EtpId,
out manualResetEventSlim))
{
manualResetEventSlim = new ManualResetEventSlim();
_etpIdToReadyEventSlim.Add(procedure.EtpId, manualResetEventSlim);
Task.Run(() => DoWaitAsync(procedure.EtpId,
cancellationToken),
cancellationToken);
}
}
manualResetEventSlim.Wait(cancellationToken);
lock (_etpIdToReadyEventSlim)
{
if (_etpIdToReadyEventSlim.Remove(procedure.EtpId))
{
manualResetEventSlim.Dispose();
}
}
return Task.CompletedTask;
}
private async Task DoWaitAsync(string etpId,
CancellationToken cancellationToken = default)
{
Guid id = Guid.NewGuid();
DateTime startsAtUtc = DateTime.UtcNow;
try
{
while (DateTime.UtcNow - startsAtUtc < _settings.MaxWaitingTimeSpan)
{
try
{
cancellationToken.ThrowIfCancellationRequested();
Console.WriteLine($"Id работы: {id}");
await Task.Delay(_settings.BetweenChecksDelay,
cancellationToken);
}
catch (Exception e)
{
//Ignore
}
}
}
finally
{
_etpIdToReadyEventSlim[etpId].Set();
}
}
}
Можно ли всё поместить в один lock?