2009-10-27 30 views
1

我有許多方法的WCF服務。我希望在執行其中一種方法之後,電子郵件將發送給某些用戶。發送電子郵件可能是一個長時間運行的操作,我不希望這個方法的調用者等待這個時間。調用者應在計算出來後立即收到回覆,然後發送電子郵件。我正在考慮在新線程中發送電子郵件,但我不確定在IIS中託管WCF服務時啓動新線程是否正確。有人能告訴我在這種情況下最佳做法是什麼?執行服務後WCF和更長的操作

在此先感謝 盧卡斯Glaz

回答

0

有任何關於當服務在IIS託管開始新主題本身是有問題的,但考慮:

有多重要的是,發送電子郵件?

當您啓動後臺線程時,不能保證進程在操作完成之前不會崩潰。在最糟糕的情況下,機器可能會因爲外部原因(電力喪失,死亡藍屏等)而簡單地崩潰,並且實際上您無法做到這一點。在這種情況下(也可能不太嚴重的情況),線程可能永遠不會完成其操作,這意味着電子郵件永遠不會被髮送。

如果你能忍受這一點,從一個新的線程發送電子郵件是好的。另一方面,如果您必須保證始終發送電子郵件,則需要將該操作交給某種事務處理隊列(MSMQ,數據庫表或其他事務處理機制) 。

在這種情況下,您需要另一個強大的後臺進程(想到Windows服務),將消息從隊列中拉出併發送電子郵件。即使服務器突然重新啓動,該體系結構也可確保最終發送電子郵件。然而,這是一個更復雜的設置,所以我認爲你只應該實現它,如果需求狀態的電子郵件必須被髮送。

+0

電子郵件只是一個額外的通知,所以應該不需要更復雜的解決方案。 關於啓動線程:我應該創建一個新的線程實例還是使用ThreadPool?我可以補充說,需要發送電子郵件的方法不是很常見(每天幾次)。 – GUZ 2009-10-27 10:42:00

+0

除非您明確需要對Thread的引用,否則ThreadPool將很好地完成 - 除非需要更多控制,否則它應該是您開始新線程的首選(至少在.NET 4之前)。然而,由於它沒有經常被調用,所以它可能並不重要...... – 2009-10-27 10:55:22

0

您也可以進行操作OneWay,所以客戶端不會等待操作的結果。在我看來,這將是正確的選擇,因爲你基本上不關心操作的結果(郵件故障等)。如果你想確保交付,你必須爲你的服務配置可靠性。

+0

有一個需要計算的響應併發回給調用者,所以OneWay在這種情況下不是一個好主意。 – GUZ 2009-10-27 10:38:57