创建一个工作线程并在我的应用程序生命周期内保持它活着,以执行一些背景任务

Que*_*ing 5 asp.net multithreading

我有一个req,我必须创建一个工作线程,并在我的应用程序生命周期内保持它活着,以执行一些背景任务.那么有什么办法可以在我的应用程序需要时将任务堆叠到这个工作线程.

Fra*_*nov 7

更新:即使您已在评论中指出您必须在Asp.Net中执行此操作,我将在下面留下我的原始内容,因为它有一些有用的链接.

由于Asp.Net使用线程池来调度传入的请求,因此在线程池上运行后台任务将占用一个线程并影响Asp.Net性能.因此,您将不得不使用Thread该类.

要实现您的方案,您可以创建一个新Thread实例,将其IsBackground属性设置为true并启动它.一旦启动,线程将等待AutoResetEvent(使用该WaitOne方法)由传入请求(使用Setmet6hod)设置,这将向后台线程发出应该处理其任务的信号.任务完成后,后台线程将再次等待该事件.

这是最简单的实现,它不允许在请求和后台线程之间传递参数,并且不允许一次排队多个任务.如果需要支持参数或排队,则必须在传入请求无法访问的某个地方保留对线程对象的引用.

如果IIS决定回收Asp.Net工作进程,您还必须考虑在任何时间点都可以终止后台线程.此外,在后台线程中抛出异常将导致IIS回收Asp.Net工作进程.

围绕后台线程的身份还有一些考虑因素.特别是,后台线程不能轻易模拟当前传入请求的用户身份.这是可能的,但每次请求安排新任务时,都需要您传递用户身份.


如果您告诉我们您编写代码的语言和平台,将会非常有用.

如果它恰好是Windows平台,那么有一个线程池可以"借用"线程来完成任务.您可以使用QueueUserWorkItemAPI(C++)或ThreadPool.QueueUserWorkItem(C#/ .Net)在线程池上安排任务.请注意,如果您的任务将运行较长时间,则会产生一些影响.

您也可以使用无论是创建自己的线程Thread类(C#/.NET)或_beginthreadexCreateThreadAPI(C++).在这种情况下,您将必须为前台线程实现一个队列来安排任务,并且您将在后台线程上有一个循环来选择新任务并执行它们.当然,您必须使用某些同步原语(如CRITICAL_SECTION(C++)或lock statement(C#/ .Net))从两个线程同步对该队列的访问.

对于Linux或OS X,您可能会考虑POSIX threads.我没有做过很多*nix风格的编程,所以可能有更好的选择.如果您要定位其中一个平台,请将该信息添加到您的问题中,我相信很快就会有有用的答案.