.NET中在单独(单个)线程上管理任务队列的最佳方法

乔希

我知道异步编程多年来已经发生了很多变化。令我感到困惑的是,我在34岁的时候就让自己生锈了,但是我指望着StackOverflow可以使我快速入门。

我想做的是在一个单独的线程上管理“工作”队列,但是每次只能处理一个项目。我想在此线程上发布工作,它不需要将任何内容传递回调用方。当然,我可以简单地启动一个新Thread对象,并Queue使用睡眠,中断,等待句柄等使其在共享对象上循环。但是我知道从那以后情况已经变得更好。我们有BlockingCollectionTaskasync/ await,更不用提的NuGet包,可能抽象了很多的。

我知道,“什么是最好的...”问题通常会被忽略,因此我将通过说“最好使用什么是...”的方式来改写它,最好使用内置的.NET机制来完成类似的工作。但是,如果第三方NuGet程序包简化了一堆事情,那也是一样。

我考虑了一个TaskScheduler实例,其最大并发固定为1,但是到目前为止,似乎没有那么笨拙的方法了。

背景

具体来说,在这种情况下,我想做的是在Web请求期间将IP地理位置任务排队。同一IP可能会多次排队等待进行地理位置定位,但是该任务将知道如何检测到该IP,如果已经解决,则可以尽早退出。但是请求处理程序将把这些() => LocateAddress(context.Request.UserHostAddress)调用放入队列中,并让该LocateAddress方法处理重复的工作检测。我使用的地理位置API不喜欢被请求轰炸,这就是为什么我想一次将其限制为单个并发任务。但是,如果允许该方法通过简单的参数更改轻松地扩展到更多并发任务,那就太好了。

务实的

要创建异步单并行程度的工作队列,您可以简单地创建一个SemaphoreSlim,将其初始化为1,然后await在开始请求的工作之前使用获取该信号量的入队方法

public class TaskQueue
{
    private SemaphoreSlim semaphore;
    public TaskQueue()
    {
        semaphore = new SemaphoreSlim(1);
    }

    public async Task<T> Enqueue<T>(Func<Task<T>> taskGenerator)
    {
        await semaphore.WaitAsync();
        try
        {
            return await taskGenerator();
        }
        finally
        {
            semaphore.Release();
        }
    }
    public async Task Enqueue(Func<Task> taskGenerator)
    {
        await semaphore.WaitAsync();
        try
        {
            await taskGenerator();
        }
        finally
        {
            semaphore.Release();
        }
    }
}

当然,除了具有一个固定的并行度之外,只需将信号量初始化为其他数量即可。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

是从单独的线程调用方法,还是在调用线程上运行?

来自分类Dev

在目标C中的单独线程上延迟方法

来自分类Dev

不使用.net 4.0的并发任务队列的最佳替代方法是什么

来自分类Dev

在多个线程上同步Java中的队列

来自分类Dev

在后台执行任务的最佳方法是什么(application_start中的线程或调用方法)?

来自分类Dev

在JavaFX 8中管理多线程的最佳方法是什么?

来自分类Dev

亚马逊AWS中的任务/队列管理

来自分类Dev

取消线程中的任务执行并将任务从队列中删除

来自分类Dev

在Gradle中定义Javah任务的最佳方法

来自分类Dev

在主线程上执行异步任务的最佳方法

来自分类Dev

多线程在C ++中执行单个任务

来自分类Dev

Clojure:管理单个线程

来自分类Dev

如何在Android中管理可运行任务的队列

来自分类Dev

在nodejs中运行单独线程的最佳方法是什么?

来自分类Dev

在多租户应用程序中管理任务队列-GAE

来自分类Dev

在.NET中管理多个服务引用的最佳方法

来自分类Dev

在Android,主线程或单独线程上使用Accelerometer的最佳实践?

来自分类Dev

在新线程中触发方法的最佳方法

来自分类Dev

在后台执行任务的最佳方法是什么(application_start中的线程或调用方法)?

来自分类Dev

在单独的线程上运行网络任务,以避免在android API中崩溃超过3

来自分类Dev

在单独的线程上创建类实例,同时仍然能够在python中访问其方法

来自分类Dev

亚马逊AWS中的任务/队列管理

来自分类Dev

WPF窗口在单独线程中的通用方法

来自分类Dev

在单独的线程中运行while循环以检查后台任务

来自分类Dev

具有单独读取器和写入器线程的单个队列是否需要锁定?

来自分类Dev

对concurrentQueue的误解,单个使用者在其自己的线程上的队列中工作

来自分类Dev

在Action内的单独线程上运行方法

来自分类Dev

在后台线程中运行的可编辑任务队列

来自分类Dev

Clojure:管理单个线程

Related 相关文章

  1. 1

    是从单独的线程调用方法,还是在调用线程上运行?

  2. 2

    在目标C中的单独线程上延迟方法

  3. 3

    不使用.net 4.0的并发任务队列的最佳替代方法是什么

  4. 4

    在多个线程上同步Java中的队列

  5. 5

    在后台执行任务的最佳方法是什么(application_start中的线程或调用方法)?

  6. 6

    在JavaFX 8中管理多线程的最佳方法是什么?

  7. 7

    亚马逊AWS中的任务/队列管理

  8. 8

    取消线程中的任务执行并将任务从队列中删除

  9. 9

    在Gradle中定义Javah任务的最佳方法

  10. 10

    在主线程上执行异步任务的最佳方法

  11. 11

    多线程在C ++中执行单个任务

  12. 12

    Clojure:管理单个线程

  13. 13

    如何在Android中管理可运行任务的队列

  14. 14

    在nodejs中运行单独线程的最佳方法是什么?

  15. 15

    在多租户应用程序中管理任务队列-GAE

  16. 16

    在.NET中管理多个服务引用的最佳方法

  17. 17

    在Android,主线程或单独线程上使用Accelerometer的最佳实践?

  18. 18

    在新线程中触发方法的最佳方法

  19. 19

    在后台执行任务的最佳方法是什么(application_start中的线程或调用方法)?

  20. 20

    在单独的线程上运行网络任务,以避免在android API中崩溃超过3

  21. 21

    在单独的线程上创建类实例,同时仍然能够在python中访问其方法

  22. 22

    亚马逊AWS中的任务/队列管理

  23. 23

    WPF窗口在单独线程中的通用方法

  24. 24

    在单独的线程中运行while循环以检查后台任务

  25. 25

    具有单独读取器和写入器线程的单个队列是否需要锁定?

  26. 26

    对concurrentQueue的误解,单个使用者在其自己的线程上的队列中工作

  27. 27

    在Action内的单独线程上运行方法

  28. 28

    在后台线程中运行的可编辑任务队列

  29. 29

    Clojure:管理单个线程

热门标签

归档