Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
线程池C#,工作项的结果太慢,为什么?_C#_Windows_Multithreading_Forms_Threadpool - Fatal编程技术网

线程池C#,工作项的结果太慢,为什么?

线程池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的一个实例,然后获取worker项的结果(发送电子邮件的方法)。“字符串结果”接收方法的输出。如果是OK,则显示OK,否则显示异常

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:我大体上同意你的评论;但公平地说,TPL
Task
类有一个类似的
Result
属性,如果从UI线程访问,它会产生完全相同的行为。