Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.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
C# 确定在IIS中运行的ASP.NET应用程序中启动长时间运行线程的最安全方式_C#_Asp.net_Multithreading_Iis - Fatal编程技术网

C# 确定在IIS中运行的ASP.NET应用程序中启动长时间运行线程的最安全方式

C# 确定在IIS中运行的ASP.NET应用程序中启动长时间运行线程的最安全方式,c#,asp.net,multithreading,iis,C#,Asp.net,Multithreading,Iis,目前,我正在Startup.Auth.cs 当应用程序启动时,ASP.NET应用程序将在此处调用ConfigureAuth。目前,我正在这里启动我的线程,包括以下内容: try { LaunchListenThread(); } catch (ThreadAbortException e) { Console.WriteLine("Thread - caught ThreadAbortException - resetting."); Console.WriteLine(

目前,我正在
Startup.Auth.cs

当应用程序启动时,ASP.NET应用程序将在此处调用
ConfigureAuth
。目前,我正在这里启动我的线程,包括以下内容:

try {
  LaunchListenThread();
}
catch (ThreadAbortException e) {
     Console.WriteLine("Thread - caught ThreadAbortException - resetting.");
     Console.WriteLine("Exception message: {0}", e.Message);
     Thread.ResetAbort();
     LaunchListenThread();
}
System.Threading.Thread.CurrentThread.Abort();
catch(ThreadAbortException te) {
    throw te;
}
函数
LaunchListenThread()
实际上只是启动在
Startup.Auth.cs

线程被声明为

private readonly ThreadStart nThread=new ThreadStart(NetComms.StartListening)

这里我主要关心的是捕获
ThreadAbortException
,例如,如果我抛出
StartListening
,它似乎不会被前面提到的
Catch
块捕获

我想知道的是,在IIS中启动这样一个长时间运行的线程是否有一种更标准或更被接受的方式,特别是在这种方式下,我能够捕获
ThreadAbortException

到目前为止,我已经通过以下方式进行了测试:

try {
  LaunchListenThread();
}
catch (ThreadAbortException e) {
     Console.WriteLine("Thread - caught ThreadAbortException - resetting.");
     Console.WriteLine("Exception message: {0}", e.Message);
     Thread.ResetAbort();
     LaunchListenThread();
}
System.Threading.Thread.CurrentThread.Abort();
catch(ThreadAbortException te) {
    throw te;
}
错误被抛出,但随后将丢失


请告诉我是否有任何其他信息会有所帮助。

我建议您使用像
hangfire.io
这样的工具

这是


这里有一些替代方案:

由于appdomains可以(也将)回收,我养成了一种习惯,即不要在ASP.Net中运行长时间运行的进程。我通常通过WCF调用一个外部独立服务来完成这项工作。我已经很好地配置了IIS,不回收我的线程,并且我已经允许线程闲置数天或数周,它仍然保持活动状态。我现在最关心的似乎是流氓的ThreadAbortException。我不确定这以前是否真的发生过,更让我担心的是不能正确地捕捉到它;f、 前。由于多个应用程序域、web场问题等,您可能最终会遇到多个线程。ASP.NET根本不适合这样做。无论如何,如果您不确信,这些异常通常是由
Request.End()
和ASP.Net处理请求的一种方式造成的。无论哪种方式,
ThreadAbortException
都可以中止。e、 g.
te.ResetAbort()
。这些行为的后果当然是你的……另请参见:好的,谢谢你的回复。我可能应该注意到,这是一个严格意义上的非internet intranet应用程序,将处理很少的用户,并且应用程序的运行方式变化很小。谢谢,我现在正在研究hangfire。。。不过我有点好奇,人们大多指的是“后台任务”,而我想运行的是一个永久的后台侦听器。。。它是一个线程,总是等待传入的TCP连接来处理日志数据。hangfire也适用于这样的事情吗?@user1438893确定它在hangfire中被称为“开火并忘记任务:)设置起来很容易,几乎让人感觉像是作弊!但我现在不确定的是错误处理。我传递给Hangfire的函数是
StartListening()
,但该函数所在的整个类包含相当多的网络和数据库操作。是否有关于Hangfire的文档专门涉及我的代码是否抛出异常或类似的事情?我应该注意到,据我所知,我的代码中没有发生未捕获异常的执行路径。我只是想知道这将如何工作。@user1438893是的,那里有最好的文档之一。看看这里:令人印象深刻!我正在抛出未处理的异常,Hangfire似乎能优雅地处理它们。谢谢你的建议!