首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免长连接时间

避免长连接时间
EN

Stack Overflow用户
提问于 2014-10-20 08:36:51
回答 1查看 63关注 0票数 0

我有一门课叫短信。当创建类的实例时,就会与服务建立连接,而服务又可以访问数据库。这个连接需要5秒(下面是Messaging.Connection MESConnection = new Messaging.Connection();),.The类有一个方法,用户可以提交一条消息,该消息将一些数据放入数据库。

当用户按下一个按钮时,我希望使用线程向数据库提交X个消息。我使用任务parralel库来完成这个任务,但问题是X线程创建类的X实例,这意味着如果X是30,则整个操作大约需要10秒。

我怎么能脱机地打开10个连接,以至于当消息被提交时,数据库的连接已经打开,因此我可以避免5秒的连接时间?

C#码

代码语言:javascript
复制
// Loop through and multithread


foreach (string container in containers)
        {

            int output = Convert.ToInt32(container);
            Task t = Task.Factory.StartNew(() =>
            {

                Messaging.Connection MESConnection = new Messaging.Connection(); //Takes 5 seconds
                BSCContainerWorkflowResponse.BscContainerWorkflowResponse WorkflowResponse2;

                // Get device next step
                MESConnection.xmlMessage = Messaging.BscContainerNextTaskRequest(Convert.ToString(output));

                // Send message to MES
                String result;

                result = MESConnection.SendMessage();
                if (result != "")
                {
                    MessageBox.Show("Error sending message to MES: " + result);
                    return null;
                }

                result = MESConnection.GetReply();
                if (result != "")
                {
                    MessageBox.Show("Error receiving message from MES: " + result);
                    return null;
                }


                WorkflowResponse2 = BSCContainerWorkflowResponse.ReadBscContainerWorkflowResponse(MESConnection.xmlReply);


                if (WorkflowResponse2.mes_message.msg_header.msg_stat < 0)
                {
                    MessageBox.Show("Error with mes Response " + " message stat:" + Convert.ToString(WorkflowResponse.mes_message.msg_header.msg_stat) + " Error source " + (WorkflowResponse.mes_message.msg_error.error_source) + " Error code " + (WorkflowResponse.mes_message.msg_error.error_code) + " Error string " + Convert.ToString(WorkflowResponse.mes_message.msg_error.error_string), "MES Message Error");
                    return null;
                }

                return WorkflowResponse2;

            }).ContinueWith(o =>
            {
                listBox1.Items.Add(o.Result.mes_message.msg_body.Container.Name + " " + o.Result.mes_message.msg_body.Container.Product.Name + " " + o.Result.mes_message.msg_body.Container.Product.BscModelNumber + " " + o.Result.mes_message.msg_body.Container.BscSerialNumber + " " + o.Result.mes_message.msg_body.Container.TaskList.Name + " " + o.Result.mes_message.msg_body.Container.TaskList.Revision + " " + Convert.ToString(o.Result.mes_message.msg_body.Container.MfgOrder.BscSWR));
                buttonSendBSCNextTaskRequestThreaded.Text = "Process";
                buttonSendBSCNextTaskRequestThreaded.Enabled = true;

            }, TaskScheduler.FromCurrentSynchronizationContext());

        }     
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-20 09:04:15

正确的方法是使用连接池来减少长连接时间。ADO.NET提供程序内置了此功能。如果连接类没有,则可以使用自己实施一项,因为它可以提高整个应用程序的性能。

不过,在这种特殊情况下,正确的做法是比较哪些时间更长:

  • 若要创建多个连接以推动数据通过或
  • 重用单个连接来推动数据通过

这将取决于您正在推送的数据数量和所涉及的延迟。

为了保持简单,我可能会从重用1连接开始,如果发现不足,尝试连接池。只有当延迟非常高时,我才会求助于并行化。

如果您不再使用可处理的东西,请始终将其处理--连接通常需要处理。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26461511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档