Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 到许多等待信号量的线程_C#_Multithreading_Semaphore - Fatal编程技术网

C# 到许多等待信号量的线程

C# 到许多等待信号量的线程,c#,multithreading,semaphore,C#,Multithreading,Semaphore,假设我每秒都有一个计时器调用方法 方法是异步的(必须是异步的),我使用信号量lim同步方法。 方法需要5秒才能完成 我将有许多线程等待信号量。这是真的吗?这是个问题吗? 由于这是计时器,我将有越来越多的线程等待信号量 我如何解决这个问题? 如果信号量没有释放(只是跳过代码),是否可以不等待 计时器: PoolReportTimer = new Timer(ReportTimerCallback, null, TimeSpan.Zero, TimeSpan.FromSeconds(1));

假设我每秒都有一个计时器调用方法

方法是异步的(必须是异步的),我使用信号量lim同步方法。 方法需要5秒才能完成

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

我如何解决这个问题? 如果信号量没有释放(只是跳过代码),是否可以不等待

计时器:

  PoolReportTimer = new Timer(ReportTimerCallback, null, TimeSpan.Zero, TimeSpan.FromSeconds(1));
方法:

    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-解决方案:

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


如果希望在另一个线程挂起信号量时跳过等待,可以使用该方法传递时间跨度(比如说十分之一秒)并等待结果。如果它是
false
,其他人仍在占用您的资源,您可以对此做出反应(例如,跳过您想做的任何事情)。

如果您想跳过等待信号量的过程(如果另一个线程占用了该信号量),您可以使用该方法来传递时间跨度(比方说十分之一秒)然后等待结果。如果
为false
,则其他人仍持有您的资源,您可以对该事实作出反应(例如,跳过您想做的任何事情)。

我认为不需要您描述的内容。这闻起来像个XY问题。你能描述一下你想做什么吗?不是代码方面的问题,但您希望实现什么?我希望在异步方法中每隔几秒钟获取一次报告。但我想确定的是,若这个方法需要很多时间来完成,那个么这将不会是一个问题。那个么,若它确实需要太长的时间呢?假设一个1秒计时器需要2秒。是否要在程序停止之前发送新线程的垃圾邮件?如果你不想等待一个完成,为什么要等待和信号量?我需要信号量,因为我不知道如何在没有信号量的异步方法中同步。锁不能在异步方法中使用。您可以从代码中后退一步吗。你能解释一下你想发生什么吗?所以每一秒你都会制作一份报告。当生成报告需要2秒钟时会发生什么?我不认为有必要使用您描述的内容。这闻起来像个XY问题。你能描述一下你想做什么吗?不是代码方面的问题,但您希望实现什么?我希望在异步方法中每隔几秒钟获取一次报告。但我想确定的是,若这个方法需要很多时间来完成,那个么这将不会是一个问题。那个么,若它确实需要太长的时间呢?假设一个1秒计时器需要2秒。是否要在程序停止之前发送新线程的垃圾邮件?如果你不想等待一个完成,为什么要等待和信号量?我需要信号量,因为我不知道如何在没有信号量的异步方法中同步。锁不能在异步方法中使用。您可以从代码中后退一步吗。你能解释一下你想发生什么吗?所以每一秒你都会制作一份报告。生成报告需要2秒钟时会发生什么?请参阅我问题中的编辑2。你是这么想的吗?@Raskolnikov啊,是的。谢谢你的帮助。见我问题中的编辑2。你是这么想的吗?@Raskolnikov啊,是的。谢谢你的帮助。