2011-08-28 40 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

相关问题