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

并发调用的C#async方法应等待第一个操作完成,c#,.net,C#,.net,我有一个方法 public async Task<OpenResult> openAsync() 公共异步任务openAsync() 我想做一些事情,比如如果在执行过程中有一个对openAsync的当前调用,我想将对openAsync的任何调用添加到队列中 当第一次调用完成时,我想用第一次调用的结果完成队列中的所有调用 在C#中实现这一点的方法通常,这种细节留给调用方,也就是说,让调用方适当地等待,并且只在应该调用方法时调用方法。然而,如果必须这样做,一种简单的方法是通过信号量;

我有一个方法

public async Task<OpenResult> openAsync()
公共异步任务openAsync() 我想做一些事情,比如如果在执行过程中有一个对openAsync的当前调用,我想将对openAsync的任何调用添加到队列中

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

在C#

中实现这一点的方法通常,这种细节留给调用方,也就是说,让调用方适当地等待,并且只在应该调用方法时调用方法。然而,如果必须这样做,一种简单的方法是通过信号量;考虑:

class-HazProtected
{
私有只读信号量lim _lock=新信号量lim(1,1);
公共异步任务OpenAsync(CancellationToken CancellationToken=默认值)
{
wait _lock.WaitAsync(cancellationToken);
尝试
{
返回等待同步(取消令牌);
}
最后
{
_锁定。释放();
}
}
专用异步任务同步(CancellationToken CancellationToken)
{
//…这里是你的真实代码
}
}
OpenAsync
中的代码确保一次只能有一个并发异步调用方尝试打开它。当发生冲突时,调用方将异步保持,直到可以获取信号量为止。不过,有一个复杂的问题
SempahoreSlim
在.NET Framework上存在一些已知问题(在.NET Core中解决),即同时存在异步和同步信号量采集-



在更复杂的场景中,可以编写自己的挂起调用方队列;这是一个非常奇特的场景,通常不应该尝试,除非你确切地理解为什么要这样做

异步调用在它们之间是独立的。你想要达到的目标是什么?你能提供更多的信息吗?为什么代码不等待方法完成呢?如何调用
openAsync
?是否有缺失的
等待
信息?不需要任何队列,任务就是这样工作的;1) 调用者担心并发性,只适当地调用方法,在它们之间等待——通常来自单个调用者逻辑流;2) 该类型担心并发性,使用逻辑队列(通常是针对同一实例的多个并行调用方流);第一种是非常容易实现和理解的,并且是目前为止的大多数用法;第二个真的很难;你确定你需要吗?你能解释一下你为什么需要这个吗?这是可以做到的,但是。。。这是一件很难解释的事情,而且很难回答这个问题。我们不知道类是如何设计的,这个方法位于何处,调用者位于何处,谁将向队列添加条目。您是否考虑过使用仅具有此方法的SuntLon类并同步运行该方法?如果可以将其简化为类似于访问周围的信号量SLIM的话,那么也更容易实现这一点,因此只允许一个并发调用方(任何其他并发调用方都在信号量上等待)。