![](/img/trans.png)
[英]Call an async method on pageload and wait for to complete the execution - 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.