小编Rya*_*dge的帖子

Task.WhenAll()一次只执行2个线程?

在这个问题中,我试图缓存单个值,让我们称之为foo.如果未缓存该值,则需要一段时间才能检索.

我的问题不是实现它,而是测试它.

为了测试它,我使用Task.WhenAll()来启动5个同步任务来获取缓存值.第一个进入锁并以异步方式检索值,而其他4个线程等待锁.在等待之后,他们应该逐个重新检查缓存的值,发现它已被缓存它的第一个线程检索到,并在没有第二次检索的情况下返回它.

[TestClass]
public class Class2
{
    private readonly Semaphore semaphore = new Semaphore(1, 1);

    private bool? foo;

    private async Task<bool> GetFoo()
    {
        bool fooValue;

        // Atomic operation to get current foo
        bool? currentFoo = this.foo;

        if (currentFoo.HasValue)
        {
            Console.WriteLine("Foo already retrieved");
            fooValue = currentFoo.Value;
        }
        else
        {
            semaphore.WaitOne();
            {
                // Atomic operation to get current foo
                currentFoo = this.foo;

                if (currentFoo.HasValue)
                {
                    // Foo was retrieved while waiting
                    Console.WriteLine("Foo retrieved while waiting"); …
Run Code Online (Sandbox Code Playgroud)

c# caching semaphore locking task

4
推荐指数
1
解决办法
1560
查看次数

标签 统计

c# ×1

caching ×1

locking ×1

semaphore ×1

task ×1