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# 在for循环中启动多个线程无效_C#_Multithreading_Ibm Mq_Mq - Fatal编程技术网

C# 在for循环中启动多个线程无效

C# 在for循环中启动多个线程无效,c#,multithreading,ibm-mq,mq,C#,Multithreading,Ibm Mq,Mq,我试图从WebSphereMQ队列中读取消息并将其转储到另一个队列中 下面是我要做的代码 private void transferMessages() { MQQueueManager sqmgr = connectToQueueManager(S_SERVER_NAME, S_QMGR_NAME, S_PORT_NUMBER, S_CHANNEL_NAME); MQQueueManager dqmgr = connectToQueueManager(D_SERVER_NAME

我试图从WebSphereMQ队列中读取消息并将其转储到另一个队列中

下面是我要做的代码

private void transferMessages()
{
    MQQueueManager sqmgr = connectToQueueManager(S_SERVER_NAME, S_QMGR_NAME, S_PORT_NUMBER, S_CHANNEL_NAME);
    MQQueueManager dqmgr = connectToQueueManager(D_SERVER_NAME, D_QMGR_NAME, D_PORT_NUMBER, D_CHANNEL_NAME);
    if (sqmgr != null && dqmgr != null)
    {
        MQQueue sq = openSourceQueueToGet(sqmgr, S_QUEUE_NAME);
        MQQueue dq = openDestQueueToPut(dqmgr, D_QUEUE_NAME);
        if (sq != null && dq != null)
        {
            setPutMessageOptions();
            setGetMessageOptions();
            processMessages(sqmgr, sq, dqmgr, dq);
        }
    }
}
我在for循环中调用上述方法,并创建单独的线程,如下所示

int NO_OF_THREADS = 5;
Thread[] ts = new Thread[NO_OF_THREADS];
for (int i = 0; i < NO_OF_THREADS; i++)
{ 
    ts[i] = new Thread(() => transferMessages());
    ts[i].Start();        
}

有什么建议我遗漏了什么吗?

这是因为MQ的
共享对话
(SHARECNV)
功能,其中来自一个应用程序的多个到队列管理器的连接共享同一套接字。此值是客户端和队列管理器在建立连接时协商的值。默认情况下,通过套接字共享10个连接

您可以将应用程序中的线程数增加到11,然后可以看到第二个连接正在打开。有关SHARECNV的更多详细信息,请参阅

更新 为put和get分别运行6个线程时的通道状态。注意:我正在连接到同一队列管理器(仅用于测试)。SHARECNV设置为10

     2 : dis chstatus(MY.SVRCONN)
AMQ8417: Display Channel Status details.
   CHANNEL(MY.SVRCONN)                     CHLTYPE(SVRCONN)
   CONNAME(127.0.0.1)                      CURRENT
   STATUS(RUNNING)                         SUBSTATE(RECEIVE)
AMQ8417: Display Channel Status details.
   CHANNEL(MY.SVRCONN)                     CHLTYPE(SVRCONN)
   CONNAME(127.0.0.1)                      CURRENT
   STATUS(RUNNING)                         SUBSTATE(RECEIVE)
每次运行5个线程时

 3 : dis chstatus(MY.SVRCONN)
AMQ8417: Display Channel Status details.
   CHANNEL(MY.SVRCONN)                     CHLTYPE(SVRCONN)
   CONNAME(127.0.0.1)                      CURRENT
   STATUS(RUNNING)                         SUBSTATE(RECEIVE)

链中的某些内容正在序列化connect调用。在您自己的connectToQueueManager或MQ API中。无论如何,你不应该使用线程(看看任务和线程池)。@Henk,我已经添加了自定义connectToQueueManager方法代码。它除了创建到队列管理器的连接之外,没有什么别的功能,方法是使用哈希表存储连接属性,并使用标准MQ API创建到MQ队列管理器的连接。。此外,根据您的建议,我将检查任务或线程池。。我将在找到解决我所面临问题的方法后进行更新。谢谢。如果您的应用程序连接同一组队列管理器,那么为什么不只连接和打开队列一次呢@Shashi,我想通过与队列管理器建立多个连接并打开队列的多个读写器,以更快的速度从队列中读取消息。在这里发布我的问题之前,我尝试将其更改为0和其他不同的值。运气不好。运行了测试程序并将结果作为更新发布。能否在启动程序之前和之后发布队列管理器连接?(DIS QMSTATUS CONNS)以及队列IPPROC和OPPROC?您是说上面的代码有效,我必须对MQ配置/队列管理器配置进行一些更改吗?PS:我运行了另一个程序,该程序成功地与队列管理器建立了多个连接。当我现在运行它时,它失败了。正在尝试使用其他队列管理器进行测试。谢谢。修改了您的代码以建立连接,删除了打开队列的代码。所以没有IPPROC/OPPROC的详细信息。启动程序之前和之后的连接数分别为22和32。请记住使用DISPLAY CONN命令,该命令将显示到队列管理器的连接数,即使它们通过一个通道共享(因此DISPLAY CHSTATUS将仅显示一个连接)。这将帮助您确定是否正在进行多个连接。
 3 : dis chstatus(MY.SVRCONN)
AMQ8417: Display Channel Status details.
   CHANNEL(MY.SVRCONN)                     CHLTYPE(SVRCONN)
   CONNAME(127.0.0.1)                      CURRENT
   STATUS(RUNNING)                         SUBSTATE(RECEIVE)