Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net何时终止后台线程?_Asp.net_Multithreading - Fatal编程技术网

Asp.net何时终止后台线程?

Asp.net何时终止后台线程?,asp.net,multithreading,Asp.net,Multithreading,我在做一个项目,其中有一部分是批量发送电子邮件,当用户单击按钮时,他/她会立即收到“感谢已发送的电子邮件”,作为响应,同样的方法也会触发一个异步线程 ThreadPool.QueueUserWorkItem(SendEMail, _message); 当用户单击“发送”按钮时,此线程将排队,但由于这是默认的后台线程我在页面响应结束时预期的,因此此线程将被终止,但没有发生,因为触发此线程的当前线程也是后台线程和工作线程,这意味着有一个未完成的前台线程(可能是主线程或工作线程)仍然处于活动状态,但

我在做一个项目,其中有一部分是批量发送电子邮件,当用户单击按钮时,他/她会立即收到“感谢已发送的电子邮件”,作为响应,同样的方法也会触发一个异步线程

ThreadPool.QueueUserWorkItem(SendEMail, _message);
当用户单击“发送”按钮时,此线程将排队,但由于这是默认的
后台线程
我在页面响应结束时预期的,因此此线程将被终止,但没有发生,因为触发此线程的当前线程也是
后台线程
工作线程
,这意味着有一个未完成的前台线程(可能是主线程或工作线程)仍然处于活动状态,但我不知道它们何时完成,因为它们的完成时间将影响我的后台工作线程;当最后一个前台线程结束时,它会导致进程终止,后台线程也是如此

我应该害怕这个,或者Asp.NET可以自动处理它,我有点困惑,因为我读了很多关于它的东西,现在一切都搞混了

你能澄清一下吗


提前感谢。

当您调用时,将从线程池中提取一个新线程(如果可用),并在此线程上执行回调函数。如果没有可用的线程,函数将阻塞,直到释放线程。一旦完成方法的执行,线程将被挂起并返回到池中以供进一步重用。您唯一关心的应该是池中的线程也用于服务请求,因此,如果对它们执行冗长的任务,可能会危及整个系统的请求服务功能,因为池中的线程数量有限,并且如果所有线程都忙于执行冗长的操作,则未来的HTTP请求将排队。作为另一种选择,您可以考虑手动创建线程:<代码>新线程(状态={{}).State();<代码>

调用新线程时,将从线程池(如果可用)中提取新线程,并在此线程上执行回调函数。如果没有可用的线程,函数将阻塞,直到释放线程。一旦完成方法的执行,线程将被挂起并返回到池中以供进一步重用。您唯一关心的应该是池中的线程也用于服务请求,因此,如果对它们执行冗长的任务,可能会危及整个系统的请求服务功能,因为池中的线程数量有限,并且如果所有线程都忙于执行冗长的操作,则未来的HTTP请求将排队。作为另一种选择,您可以考虑手动创建线程:<代码>新线程(状态={{}).State();<代码>

在长时间运行的任务中使用线程池将对应用程序的性能产生负面影响(因为ASP.NET还使用线程池处理传入的请求)

如果创建的线程太多,则为每个任务手动创建线程也可能成为问题


我在过去使用过的一种技术是在启动应用程序时创建一个自定义线程池,并在该线程池上排队执行任务。一个简单的自定义线程池可以由一个线程和一个任务队列组成。

将线程池用于长时间运行的任务将对应用程序的性能产生负面影响(因为ASP.NET还使用线程池来处理传入的请求)

如果创建的线程太多,则为每个任务手动创建线程也可能成为问题


我在过去使用过的一种技术是在启动应用程序时创建一个自定义线程池,并在该线程池上排队执行任务。一个简单的自定义线程池可以由一个线程和一个任务队列组成。

您可以使用MSMQ创建电子邮件队列,并让一个线程处理该队列

下面的文章可能很有用,因为它适合你的问题领域。虽然它不使用MSMQ,但它是使用ASP.net处理计划任务的好文章


您可以使用MSMQ创建电子邮件队列,并使用单线程处理队列

下面的文章可能很有用,因为它适合你的问题领域。虽然它不使用MSMQ,但它是使用ASP.net处理计划任务的好文章


那么前台线程呢?哪一个是前台事件还是主事件?我如何知道它们何时发生?通常不赞成手动创建线程,尤其是在ASP.NET应用程序中。如果创建的线程太多,将大大降低应用程序的速度。我不确定我是否理解您的问题。“你能再详细说明一下你的情况吗?”汤米,我同意你的看法。一般来说,这样的任务应该从ASP.NET应用程序卸载到NT服务中,…@Darin:谢谢您的帮助,但通常在从服务器请求页面时,必须有前台线程在处理,对吗?所以,如果从线程池中取出的每个线程都是后台线程,那么Asp.NET运行时本身激发的前台线程在哪里?(我无意中问汤米:)那么前台线程呢?哪一个是前台事件还是主事件?我如何知道它们何时发生?通常不赞成手动创建线程,尤其是在ASP.NET应用程序中。如果创建的线程太多,将大大降低应用程序的速度。我不确定我是否理解您的问题。“你能再详细说明一下你的情况吗?”汤米,我同意你的看法。一般来说,这样的任务应该从ASP.NET应用程序卸载到NT服务中,…@Darin:谢谢您的帮助,但通常在从服务器请求页面时,必须有前台线程在处理,对吗?所以,如果从线程池中取出的每个线程都是后台线程,那么Asp.NET运行时itsel启动的前台线程在哪里