gpt4 book ai didi

c# - 在 .NET 4 中使用 await SemaphoreSlim.WaitAsync

转载 作者:太空狗 更新时间:2023-10-29 22:18:53 27 4
gpt4 key购买 nike

我的应用程序正在使用 .NET 4。我正在使用 nuget package 来等待异步

在我的应用程序中,我想按如下方式在 sempahore WaitAsync 调用上进行等待。

SemaphoreSlim semphore = new SemaphoreSlim(100);
await semphore.WaitAsync();

但是我遇到了以下编译错误。

'System.Threading.SemaphoreSlim' does not contain a definition for 'WaitAsync' and no extension method 'WaitAsync' accepting a first argument of type 'System.Threading.SemaphoreSlim' could be found (are you missing a using directive or an assembly reference?)

.NET 4.0 中是否存在 uisng WaitAsync?

最佳答案

您不能在 .Net 4.0 中使用 SemaphoreSlim.WaitAsync,因为此方法已添加到 SemaphoreSlim在 .Net 4.5 中。

然而,您可以按照 Stephen Toub 在 Building Async Coordination Primitives, Part 5: AsyncSemaphore 中的示例实现自己的 AsyncSemaphore :

public class AsyncSemaphore
{
private readonly static Task s_completed = Task.FromResult(true);
private readonly Queue<TaskCompletionSource<bool>> m_waiters = new Queue<TaskCompletionSource<bool>>();
private int m_currentCount;

public AsyncSemaphore(int initialCount)
{
if (initialCount < 0) throw new ArgumentOutOfRangeException("initialCount");
m_currentCount = initialCount;
}

public Task WaitAsync()
{
lock (m_waiters)
{
if (m_currentCount > 0)
{
--m_currentCount;
return s_completed;
}
else
{
var waiter = new TaskCompletionSource<bool>();
m_waiters.Enqueue(waiter);
return waiter.Task;
}
}
}
public void Release()
{
TaskCompletionSource<bool> toRelease = null;
lock (m_waiters)
{
if (m_waiters.Count > 0)
toRelease = m_waiters.Dequeue();
else
++m_currentCount;
}
if (toRelease != null)
toRelease.SetResult(true);
}
}

关于c# - 在 .NET 4 中使用 await SemaphoreSlim.WaitAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28028262/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com