C# 多线程MSMQ读取
我已经创建了一个Windows服务,可以从MSMQueue读取消息,我需要并行地执行此操作(两个线程应该同时读取消息)。我该怎么做? 这是我的代码(基本上是按书写的): 这是我的主要职责:C# 多线程MSMQ读取,c#,multithreading,msmq,C#,Multithreading,Msmq,我已经创建了一个Windows服务,可以从MSMQueue读取消息,我需要并行地执行此操作(两个线程应该同时读取消息)。我该怎么做? 这是我的代码(基本上是按书写的): 这是我的主要职责: static class Program { static void Main() { ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] {
static class Program
{
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new MyNewService()
};
ServiceBase.Run(ServicesToRun);
}
}
我将在多个windows服务上托管队列读取器的单线程实例
这样,您可以通过增加额外的服务来提高吞吐量,或者通过减少服务来降低吞吐量。这比试图在代码中完成这一切要简单得多 我将在多个windows服务上托管队列读取器的单线程实例
这样,您可以通过增加额外的服务来提高吞吐量,或者通过减少服务来降低吞吐量。这比试图在代码中完成这一切要简单得多 有什么原因不能只在多个线程上进行处理而不在多个线程上出列 这是一个非常基本的实现—它使用
ThreadPool
来对项目进行排队,但是您需要依赖ThreadPool
的队列来处理线程数和工作项目数。这可能不适合你的情况,这取决于许多其他因素
另外,请注意有关SetMaxThreads
的备注部分
有什么原因不能只在多个线程上进行处理而不在多个线程上出列 这是一个非常基本的实现—它使用
ThreadPool
来对项目进行排队,但是您需要依赖ThreadPool
的队列来处理线程数和工作项目数。这可能不适合你的情况,这取决于许多其他因素
另外,请注意有关SetMaxThreads
的备注部分
有什么问题吗?在我看来,像从队列中挑选消息这样的事情不会从并行化中受益。你确定这不是处理要并行化的消息所产生的工作负载吗?这是一个漏洞:我将MSMQ reader作为控制台应用程序。当我在队列中发送1000条消息时,该阅读器的一个实例在大约15分钟内处理它们。当我启动该控制台应用程序的两个实例时,它们将在8分钟内完成。现在,我有了具有相同读卡器的Windows服务(上面的代码)(处理需要15分钟)。我如何在代码中创建该阅读器的两个实例,以便它们更快地读取消息(必须在代码中)?有什么问题吗?在我看来,从队列中挑选消息之类的事情不会从并行化中受益。你确定这不是处理要并行化的消息所产生的工作负载吗?这是一个漏洞:我将MSMQ reader作为控制台应用程序。当我在队列中发送1000条消息时,该阅读器的一个实例在大约15分钟内处理它们。当我启动该控制台应用程序的两个实例时,它们将在8分钟内完成。现在,我有了具有相同读卡器的Windows服务(上面的代码)(处理需要15分钟)。如何在代码中创建该阅读器的两个实例,以便它们更快地读取消息(必须在代码中)??
static class Program
{
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new MyNewService()
};
ServiceBase.Run(ServicesToRun);
}
}
private static void MyReceiveCompleted(Object source, ReceiveCompletedEventArgs asyncResult)
{
try
{
MessageQueue mq = (MessageQueue)source;
Message m = mq.EndReceive(asyncResult.AsyncResult);
// TODO: Process each message on a separate thread
// This will immediately queue all items on the threadpool,
// so there may be more threads spawned than you really want
// Change how many items are allowed to process concurrently using ThreadPool.SetMaxThreads()
System.Threading.ThreadPool.QueueUserWorkItem(new WaitCallback(doWork), m);
// Restart the asynchronous receive operation.
mq.BeginReceive();
}
catch(MessageQueueException)
{
// Handle sources of MessageQueueException.
}
return;
}
private static void doWork(object message)
{
// TODO: Actual implementation here.
}