繁体   English   中英

C# 并发调用的异步方法应该等待第一个操作完成

[英]C# async method called concurrently should wait for the first operation to complete

我有一个看起来像的方法

public async Task<OpenResult> openAsync()

我想做一些事情,比如如果在执行过程中有对 openAsync 的当前调用,我想将对 OpenAsync 的任何调用添加到队列中。

当第一个调用完成时,我想用第一个调用的结果完成队列中的所有调用。

C#有什么方法可以实现

通常,这种细节留给调用者,即让调用者适当地await ,并且只在他们应该调用方法时才调用方法。 但是,如果您必须这样做,一种简单的方法是通过信号量; 考虑:

class HazProtected
{
    private readonly SemaphoreSlim _lock = new SemaphoreSlim(1, 1);

    public async Task<OpenResult> OpenAsync(CancellationToken cancellationToken = default)
    {
        await _lock.WaitAsync(cancellationToken);
        try
        {
            return await DoOpenAsync(cancellationToken);
        }
        finally
        {
            _lock.Release();
        }
    }

    private async Task<OpenResult> DoOpenAsync(CancellationToken cancellationToken)
    {
        // ... your real code here
    }
}

OpenAsync中的代码确保一次只能有一个并发异步调用方尝试打开它。 当发生冲突时,调用者将被异步保留,直到可以获取信号量。 但是,有一个复杂的问题; SempahoreSlim在 .NET Framework(在 .NET Core 中解决)上同时存在异步同步信号量获取时存在一些已知问题 - 这可能导致死亡螺旋


在更复杂的场景中,可以编写自己的待处理呼叫者队列; 这是一个非常非常奇特的场景,通常不应该尝试,除非你完全明白你为什么要这样做!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM