线程池C#,工作项的结果太慢,为什么?
我不知道我是否做错了什么,我正在使用SmartThreadPool来管理我的线程。在这个特殊情况下,我调用SmartThreadPool的一个实例,然后获取worker项的结果(发送电子邮件的方法)。“字符串结果”接收方法的输出。如果是OK,则显示OK,否则显示异常线程池C#,工作项的结果太慢,为什么?,c#,windows,multithreading,forms,threadpool,C#,Windows,Multithreading,Forms,Threadpool,我不知道我是否做错了什么,我正在使用SmartThreadPool来管理我的线程。在这个特殊情况下,我调用SmartThreadPool的一个实例,然后获取worker项的结果(发送电子邮件的方法)。“字符串结果”接收方法的输出。如果是OK,则显示OK,否则显示异常 SmartThreadPool smartThreadPool = new SmartThreadPool(); String result = (String)smartThreadPool.QueueWorkItem(x =&
SmartThreadPool smartThreadPool = new SmartThreadPool();
String result = (String)smartThreadPool.QueueWorkItem(x => emailHelper.sendEmail(whichMail.Text, emailTo.Text, subject.Text, bodyMsg.Text)).Result;
if (result != "True")
helper.showMessageBox(Properties.Resources.emailNotSent + result, "x");
else
aux.setRadDesktop(Properties.Resources.emailSent, "", false);
问题是,当我将结果转换为字符串时,它太慢了,甚至我的UI被挂起了2秒钟,我不知道为什么。如果通过执行以下操作忽略工作项结果:
smartThreadPool.QueueWorkItem(x => emailHelper.sendEmail(whichMail.Text, emailTo.Text, subject.Text, bodyMsg.Text));
一切正常,有什么线索吗?问题不在于强制转换为字符串,而在于使用
Result
属性,该属性在返回值之前等待工作项完成。我最后执行了一个嵌套线程,它工作得非常完美。谢谢大家。您的smart threadpool没有那么聪明。它允许您等待TP结果。这并不是一个很好的功能,发送电子邮件可能需要几秒钟的时间。在线程上运行它已经没有意义了,不妨直接调用该方法。使用.NET ThreadPool.QueueUserWorkItem()方法永远不会犯这种错误。扔掉SmartThreadPool类,它会给你带来麻烦。@HansPassant同样适用于任务
?@HansPassant:我大体上同意你的评论;但公平地说,TPLTask
类有一个类似的Result
属性,如果从UI线程访问,它会产生完全相同的行为。