2011-08-28 39 views
1

我正在尋找一種可配置的方式在後臺線程上運行一些代碼,我不太確定「最佳實踐」是什麼。目前我有一些沿線:如何可選地在後臺線程上運行一些代碼?

Dim sendEmails = Sub() 
        Dim emailToSend As New SendEmailRequest() 
        TransferCommonValuesTo(emailToSend, request, sendingUser) 
        usersToSendEmailTo.ForEach(Sub(u) 
                TransferValuesTo(emailToSend, u, m_EmailMessageMerger.GetMergedMessage(request.Message, u)) 
                m_EmailSender.Send(emailToSend) 
               End Sub) 
       End Sub 


If cfg.SendBulkEmailUsingBackgroundThread Then 
    Dim worker As New Thread(sendEmails) 
    worker.IsBackground = True 
    worker.Start() 
Else 
    sendEmails() 
End If 

這是實施我的要求的好方法嗎?

更新:

這將從ASP.NET前端被稱爲(儘管別人是可能的),我使用框架3.5。

+1

「問題」的語氣可能會更好地收到http://codereview.stackexchange.com/ – IAbstract

+0

謝謝 - 我從來沒有聽說過codereview! – DanP

+0

這是一個全部還是空白的情況,即對於整個應用程序,是否要配置線程打開或關閉? –

回答

2

我會傾向於在其自己的類中抽象出這種行爲說TaskRunner,並有一個接受操作的Run方法。這將線程問題分開,並使代碼更加整潔,在實現異步行爲的過程中,您還可以擁有更多的靈活性,而無需在應用程序的各個類中嵌入此類行爲。

如果您確實在Asp.Net應用程序中運行異步操作,則需要查看一種機制來保持應用程序的活動狀態,以防止應用程序回收。通過輪詢網站中的一個頁面,同時該操作正在運行以維護活動請求,因此運行時不認爲它是空閒的。

1

我懷疑大多數人會傾向於使用BackgroundWorker類。 當然你也可以在.NET 4.0中使用Task(of T)。

+0

我的印象是BackgroundWorker不適合asp.net應用程序 - 也許我錯了? – DanP

+1

BGW僅在GUI應用程序中有用。一定要適當地標記你的問題。 –

+0

@DanP:你沒有包括[標籤:asp.net]標籤 – IAbstract

0

這幾乎總是一個壞主意!!例如,請考慮在IIS中具有默認設置的情況。如果應用程序池處於空閒狀態(即未收到任何請求)20分鐘,IIS將關閉該應用程序池。在這種情況下,如果您的後臺作業運行時間超過20分鐘,則會失敗。 IIS還有幾個關閉應用程序池的原因。如果有人更改web.config,應用程序域可能會回收,從而導致作業失敗。總的來說,它不利於您的Web應用程序的穩定性。

正確的方法是使用Windows服務或其他調度組件(可能是數據庫服務器中的作業)。 有幾個可用的開源選項。對於例如Quartz.net

相關問題