2012-03-03 158 views
1

我已經創建了一個簡單的表單,它正在加載一個像電子郵件,名稱,城市等幾列csv文件,我試圖通過我有2個smtp服務器發送每日更新。我以爲使用背景工作是因爲它具有進度功能(對於我的進度條),但我也在本網站上閱讀過其他方法,例如任務,線程或線程池。通過smtp服務器異步發送電子郵件 - 多線程發送電子郵件

我還讀到,發送電子郵件必須使用異步方法完成。我不知道是否有可能,或者它是否可以優化性能,但我試圖做到以下幾點:

對於每個smtp我想用一個線程來讀取,比方說,從csv文件中的10行, 按字段拆分行並將信息發送給另一個線程,該線程將該消息發送到該小列表中的每封電子郵件。我想這樣做爲每個smtp認證程序節省一些寶貴的時間。

因爲連接到每個電子郵件的smtp需要整個套接字過程,每次像HELO,AUTH,DATA。如果我要發送電子郵件列表,我可以在認證後保持套接字打開,並且只更改我發送的數據。 10行只是一個可以自定義更改的變量。 所以,每個smtp的2個任務,意味着總共4個或者可以根據我將要使用的smtps的數量增加。

我還可以爲每個任務或背景工作人員使用其他線程嗎?

我有點困惑,因爲我是新來的C#,我還沒有找到任何關於此的例子。自從我試圖瞭解背景工作者/線程如何工作但仍未成功以來,已經過去了一個多星期。任何幫助將不勝感激,任何想法比我更好地提高性能謝謝!

回答

1

首先您需要了解不同類型的線程之間的區別。

線程池只是可供使用的線程的集合。池使用的線程由使用後返回的池&管理。您的想法是獲得性能優勢,因爲創建線程的成本只發生一次。

後臺工作者是在後臺運行的線程。後臺線程和前臺線程之間的唯一區別是後臺線程不會阻止進程終止。

發送電子郵件異步更應該而不是必須。 smtp組件沒有分離發送連接的概念。

我想你想要做的是:

  • initalise多個線程,說10
  • 閱讀從CSV一條線。
  • 將此行傳遞給上面的線程。如果沒有線程可用,請等到一個線程。
  • 在線程中解析行併發送郵件。發送不需要使用此方法進行異步,但是您可以根據需要進行發送。當你完成發送,返回線程池準備下一行

您可以管理作爲線程池 - 周圍有很多的例子,如果你谷歌的線程池 - 或者你可以做到這一點手動使用manualresetevents處理等待。使用池的好處是您可以輕鬆更改可用的工作人員數量,而不會影響您的代碼。

+0

感謝您的回覆!所以,你說我應該只使用線程池而不是task/backgroundworker/thread,對吧?你是僅僅因爲你認爲實現它或者因爲方法性能更容易才這樣說?我並不是要求最簡單的方法去做,我需要基於我發佈的信息的最佳方法。之後,我可以在谷歌搜索如何做到這一點。我還閱讀了有關等待和異步的信息,這些信息僅在新的Visual Studio中可用,我希望某些事情能夠像他們一樣行事,我的意思是這些線程在等待時用於其他事情。 – ShaMora 2012-03-03 17:48:37

+0

通過創建線程,您正在使用backgroundworkers。你將它們作爲一個集合管理,即一個線程池。這樣您將獲得最佳性能和易於實施。雖然await和async關鍵字是.net 4.5的新增功能,仍處於測試階段,但框架中仍有許多異步方法。查找beginxxxx方法,例如郵件組件上的beginSend。 – 2012-03-04 11:26:21