在.NET 4中使用等待SemaphoreSlim.WaitAsync

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吗?

i3a*_*non 5

您不能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)

  • 这不能与 Framework 4.0 一起编译,因为 Task.FromResult 未定义。我已经用新的 TaskCompletionSource&lt;bool&gt;(true).Task 替换了 Task.FromResult(true)。这可以编译,但我还没有测试过。 (2认同)