我有一个名为messaging的类。创建类的实例时,将与服务建立连接,而服务又可以访问数据库。此连接需要5秒钟(Messaging.Connection MESConnection = new Messaging.Connection();
以下)。该类有一个方法,用户可以提交一条消息,将一些数据放入数据库。
当用户按下按钮时,我想使用线程向数据库提交X条消息。我有这个使用任务parralel库,但问题是X线程创建类的X实例,这意味着如果X是30,整个操作大约需要10秒。
我如何离线说10个连接打开,这样当提交消息时,与数据库的连接已经打开,因此我可以避免5秒的连接时间?
C#代码
// 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());
}
答案 0 :(得分:2)
正确的方法是使用connection pool来缓解连接时间。 ADO.NET提供程序内置了这个。如果你的连接类没有,你可以implement one yourself,因为它可以提高整个应用程序的性能。
尽管如此,在这种特殊情况下,正确的方法是比较需要更长时间的方法:
这取决于您推送的数据量和延迟。
为了简单起见,我可能会重新开始使用1个连接,如果发现不足,请尝试连接池。如果延迟非常高,我只会求助于并行化。
如果您不再使用一次性用品,请务必丢弃一次性用品 - 连接通常需要处理。