2013-06-24 30 views
0

我不知道如果我做错了什么,我正在使用SmartThreadPool来管理我的线程。在这种特殊情况下,我调用SmartThreadPool的一个实例,然后获取worker项的结果(方法发送电子邮件)。 '字符串结果'接收方法的输出。如果确定,则显示OK,否则显示异常。ThreadPool C#,工作人员项目的结果太慢,为什么?

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

问题是当我铸造结果为String实在是太慢了,甚至我的UI被暂停像2秒,我不知道为什么。如果我忽略这样的工人项目结果:

smartThreadPool.QueueWorkItem(x => emailHelper.sendEmail(whichMail.Text, emailTo.Text, subject.Text, bodyMsg.Text)); 

一切工作正常,任何线索?

+2

你的智能线程池并不那么聪明。它允许您等待TP结果。这不完全是一个很好的功能,发送电子邮件可能需要几秒钟的时间。在线程上运行它没有任何意义,不妨直接调用该方法。你永远不会使用.NET ThreadPool.QueueUserWorkItem()方法犯这个错误。扔掉SmartThreadPool类,它会让你陷入困境。 –

+0

@HansPassant这同样适用于'Task'吗? – svick

+0

@HansPassant:我同意你的评论一般;但为了公平对待OP,TPL'任务'类具有类似的'Result'属性,如果从UI线程访问,则会产生完全相同的行为。 – Douglas

回答

0

我最终做了一个嵌套的线程,它的工作原理是单调的。谢谢大家。

1

问题不在于转换为字符串,而是在使用Result属性,该属性在返回值之前等待工作项目完成。