Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.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# log4net内部方法在hangfire中运行时出现线程错误_C#_Multithreading_Log4net_Hangfire - Fatal编程技术网

C# log4net内部方法在hangfire中运行时出现线程错误

C# log4net内部方法在hangfire中运行时出现线程错误,c#,multithreading,log4net,hangfire,C#,Multithreading,Log4net,Hangfire,我用hangfire运行进程,重复任务。这些任务设置为每分钟启动一次,并处理来自数据库的数千行 我让它们在我的测试环境中顺利运行,直到我在这些方法中添加了log4net日志记录。现在log4net抛出了一个线程错误 log4net:ERROR Failed to append to appender [AdoNetAppender] System.Threading.ThreadAbortException: Thread was being aborted. at System.Thre

我用hangfire运行进程,重复任务。这些任务设置为每分钟启动一次,并处理来自数据库的数千行

我让它们在我的测试环境中顺利运行,直到我在这些方法中添加了log4net日志记录。现在log4net抛出了一个线程错误

log4net:ERROR Failed to append to appender [AdoNetAppender]
System.Threading.ThreadAbortException: Thread was being aborted.
   at System.Threading.Monitor.ReliableEnter(Object obj, Boolean& lockTaken)
   at System.Threading.Monitor.Enter(Object obj, Boolean& lockTaken)
   at log4net.Appender.AppenderSkeleton.DoAppend(LoggingEvent loggingEvent)
   at log4net.Util.AppenderAttachedImpl.AppendLoopOnAppenders(LoggingEvent loggingEvent)
log4net:ERROR Exception while logging
System.Threading.ThreadAbortException: Thread was being aborted.
   at log4net.Util.AppenderAttachedImpl.AppendLoopOnAppenders(LoggingEvent loggingEvent)
   at log4net.Repository.Hierarchy.Logger.CallAppenders(LoggingEvent loggingEvent)
   at log4net.Repository.Hierarchy.Logger.ForcedLog(Type callerStackBoundaryDeclaringType, Level level, Object message, Exception exception)
   at log4net.Repository.Hierarchy.Logger.Log(Type callerStackBoundaryDeclaringType, Level level, Object message, Exception exception)
log4net:ERROR Failed to append to appender [AdoNetAppender]
System.Threading.ThreadAbortException: Thread was being aborted.
   at System.Threading.Monitor.ReliableEnter(Object obj, Boolean& lockTaken)
   at System.Threading.Monitor.Enter(Object obj, Boolean& lockTaken)
   at log4net.Appender.AppenderSkeleton.DoAppend(LoggingEvent loggingEvent)
   at log4net.Util.AppenderAttachedImpl.AppendLoopOnAppenders(LoggingEvent loggingEvent)
log4net:ERROR Exception while logging
System.Threading.ThreadAbortException: Thread was being aborted.
   at log4net.Util.AppenderAttachedImpl.AppendLoopOnAppenders(LoggingEvent loggingEvent)
   at log4net.Repository.Hierarchy.Logger.CallAppenders(LoggingEvent loggingEvent)
   at log4net.Repository.Hierarchy.Logger.ForcedLog(Type callerStackBoundaryDeclaringType, Level level, Object message, Exception exception)
   at log4net.Repository.Hierarchy.Logger.Log(Type callerStackBoundaryDeclaringType, Level level, Object message, Exception exception)
不太确定如何解决这个问题

我已经读到,对于后台线程,您可以设置IsBackground=true,并将销毁worker,但在我看来,它似乎将在hangfire子系统中进行管理


我更关心的是从log4net修复它,或者以不同的方式编写方法。注意,这是一个测试项目,但在实际环境中,我不会直接调用log4net,它将封装在LoggingService中。对于这个测试,我只是尽量保持简单。除非我别无选择。

我想出了这个办法,还想出了别的办法。因此,最初,Hangfire表和日志表与系统中的表位于同一数据库中。我注意到在几次测试中,我会遇到连接字符串池错误。我从测试代码中并没有真正担心这一点,因为它简化了将要使用的体系结构版本。不管怎样,我的测试是为了敲打数据库来模拟数以百万计的事务。在这次测试中,我意识到为了减轻一些冲击,我应该将hangfire移动到它的on DB,这将保存连接字符串,也移动一些DB工作,同时我还可以将日志记录移动到它的DB,这将再次在池中保存连接字符串

我说我无意中发现了这一点,因为当我决定这么做时,我并没有考虑日志记录。因此,当我再次运行测试代码时,我决定取消对hangfire执行方法中的直接日志记录的注释,它按照我最初提出问题时的预期方式工作

长话短说,请记住,连接字符串运行在不同的线程上,分隔DB具有隐藏线程的优势。这是一个非常简单的测试应用程序,不是我会在生产中运行的代码,但我也会遇到同样的问题。将很快发现,因为真正的arch开发几乎已经准备好进行测试