gpt4 book ai didi

C# 在 Web 服务中实现生产者/消费者队列

转载 作者:行者123 更新时间:2023-11-30 14:15:09 24 4
gpt4 key购买 nike

我有一个相当普通的网络服务(老式 asmx)。其中一种方法启动了一些与返回给客户端的结果无关的异步处理。希望下面的小片段有意义:

[System.Web.Services.WebMethod]
public List<Foo> SampleWebMethod(string id)
{
// sample db query
var foo = db.Query<Foo>("WHERE id=@0",id);

// kick of async stuff here - for example firing off emails
// dont wait to send result
DoAsyncStuffHere();

return foo;

}

我对 DoAsyncStuffHere 方法的初始实现使用了 ThreadPool.QueueUserWorkItem。所以,它看起来像:

public void DoAsyncStuffHere()
{
ThreadPool.QueueUserWorkItem(delegate
{
// DO WORK HERE
});
}

这种方法在低负载条件下效果很好。但是,我需要能够处理相当高负载的东西。因此,生产者/消费者模式似乎是最好的方式。

我感到困惑的地方是如何将队列完成的所有工作限制为 跨所有实例的单个线程 Web 服务。我如何最好地设置单个队列以供 Web 服务的任何实例访问?

最佳答案

您可以使用 System.Collections.Concurrent.BlockingCollection<T> System.Collections.Concurrent.ConcurrentQueue<T> 作为底层集合。
正如命名空间的名称所暗示的那样,集合是线程安全的。

使用 Take() 启动一个消费者线程(或几个)从集合中提取项目方法。当没有项目可用时,线程将阻塞。

您的 DoAsyncStuffHere 方法将项目添加到 BlockingCollection。这些项目可能未启动 System.Threading.Tasks.Task 对象;在这种情况下,消费者线程将 Start从集合中取出它们后的任务。

关于C# 在 Web 服务中实现生产者/消费者队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10553102/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com