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

c# – 在for循环中启动多个线程无效,第1张

概述我正在尝试从websphere mq队列中读取消息并将其转储到另一个队列中. 下面是我必须要做的代码 private void transferMessages(){ MQQueueManager sqmgr = connectToQueueManager(S_SERVER_NAME, S_QMGR_NAME, S_PORT_NUMBER, S_CHANNEL_NAME); MQ 我正在尝试从websphere mq队列中读取消息并将其转储到另一个队列中.

下面是我必须要做的代码

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();        }

如您所见,我正在与transferMessages方法中的队列管理器建立新的连接.不确定由于某种原因,程序只与MQ建立一个连接.

连接到队列管理器的自定义方法如下.

private MQQueueManager connectToQueueManager(string MQServername,string MQQueueManagername,string MQPortNumber,string MQChannel)    {        try        {            mqErrorString = "";            MQQueueManager qmgr;            Hashtable mqProps = new Hashtable();            mqProps.Add(MQC.HOST_name_PROPERTY,MQServername);            mqProps.Add(MQC.CHANNEL_PROPERTY,MQChannel);            mqProps.Add(MQC.PORT_PROPERTY,Convert.ToInt32(MQPortNumber));            mqProps.Add(MQC.TRANSPORT_PROPERTY,MQC.TRANSPORT_MQSERIES_CLIENT);            qmgr = new MQQueueManager(MQQueueManagername,mqProps);            return qmgr;        }        catch (MQException mqex)        {            //catch and log MQException here            return null;        }    }

有什么建议我错过了什么?

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

您可以将应用程序中的线程数增加到11,然后可以看到第二个连接被打开.关于SHARECNV的更多细节是here.

UPDATE
为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)
总结

以上是内存溢出为你收集整理的c# – 在for循环中启动多个线程无效全部内容,希望文章能够帮你解决c# – 在for循环中启动多个线程无效所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1231425.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存