BKS*_*BKS 5 c# semaphore .net-4.0 async-await
我的应用程序使用的是.NET 4.我正在使用nuget包等待异步
在我的应用程序中,我想对sempahore WaitAsync调用进行等待,如下所示.
SemaphoreSlim semphore = new SemaphoreSlim(100);
await semphore.WaitAsync();
Run Code Online (Sandbox Code Playgroud)
但是我遇到了编译错误.
'System.Threading.SemaphoreSlim'不包含'WaitAsync'的定义,并且没有可以找到接受类型'System.Threading.SemaphoreSlim'的第一个参数的扩展方法'WaitAsync'(您是否缺少using指令或程序集引用?)
无论如何在.NET 4.0中都可以使用uisng WaitAsync吗?
您不能SemaphoreSlim.WaitAsync在.Net 4.0中使用,因为此方法已添加到SemaphoreSlim.Net 4.5中.
但是,您可以AsyncSemaphore在构建异步协调基元中实现自己的以下Stephen Toub的示例,第5部分: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);
}
}
Run Code Online (Sandbox Code Playgroud)