我有一个相当普通的网络服务(老派 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 服务实例访问?