2013-06-24 29 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屬性,該屬性在返回值之前等待工作項目完成。