Можно ли весь код поместить в один 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?


Ответы (0 шт):