首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >到许多等待信号量的线程

到许多等待信号量的线程
EN

Stack Overflow用户
提问于 2016-10-21 08:48:45
回答 1查看 1.5K关注 0票数 0

假设我每秒钟都有计时器调用方法。

方法是异步(必须是异步的),而我通过使用SemaphoreSlim来同步方法。方法需要5秒才能完成。

我会有很多线程等待信号量。这是真的吗?这有问题吗?由于这是计时器,我将有越来越多的线程等待信号量。

我怎样才能解决这个问题?如果信号量未被释放,是否可以不等待(只跳过代码)?

定时器:

代码语言:javascript
复制
  PoolReportTimer = new Timer(ReportTimerCallback, null, TimeSpan.Zero, TimeSpan.FromSeconds(1));

方法:

代码语言:javascript
复制
    private static SemaphoreSlim semaphoreSlimValue = new SemaphoreSlim(1, 1);

    private async void ReportTimerCallback(object state)
    {
        try
        {
            await semaphoreSlimValue.WaitAsync();
            await Task.FromResult(0);
            Thread.Sleep(5000);
        }
        finally
        {
            semaphoreSlim.Release();
        }
    }

编辑:

我希望在异步方法中每隔几秒钟得到一次报告。但是,如果方法需要很长的时间来完成的话,我想确保这不会是问题。

编辑2-解决方案:

代码语言:javascript
复制
       private async void ReportTimerCallback(object state)
        {
            if (await semaphoreSlimValue.WaitAsync(10))
            {
                try
                {
                    await Task.FromResult(0);
                    Thread.Sleep(5000);
                }
                finally
                {
                    semaphoreSlim.Release();
                }
            }
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-21 09:08:32

如果您想跳过等待信号量(如果另一个线程对它有控制),您可以使用WaitAsync(TimeSpan)方法传递一个timespan (假设是十分之一秒)并await结果。如果是false,其他人仍然持有您的资源,您可以对此做出反应(例如,跳过您想要做的任何事情)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40172195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档