Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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# 4.0 Nlog未在并行循环中将所有行写入文件_C# 4.0_Logging_Visual Studio 2013_Nlog_Parallel.foreach - Fatal编程技术网

C# 4.0 Nlog未在并行循环中将所有行写入文件

C# 4.0 Nlog未在并行循环中将所有行写入文件,c#-4.0,logging,visual-studio-2013,nlog,parallel.foreach,C# 4.0,Logging,Visual Studio 2013,Nlog,Parallel.foreach,我按照要求使用Nlog,我在并行循环中处理数千条记录 对于按特定顺序(管道过滤器模式)执行多次操作后的每个项目,我希望将特定记录(无法加载到数据存储)写入输出文件夹 这个输出文件夹不是一个{basedir},而是一个特定于每个客户端的文件夹,因此我使用nlog和nlog变量以及如下所示的关联配置将值写入多线程应用程序的文件中 在配置文件中 <variable name="outPutFileFullName" value=""/> <target xsi:type="File

我按照要求使用Nlog,我在并行循环中处理数千条记录

对于按特定顺序(管道过滤器模式)执行多次操作后的每个项目,我希望将特定记录(无法加载到数据存储)写入输出文件夹

这个输出文件夹不是一个
{basedir}
,而是一个特定于每个客户端的文件夹,因此我使用nlog和nlog变量以及如下所示的关联配置将值写入多线程应用程序的文件中

在配置文件中

<variable name="outPutFileFullName" value=""/>

<target xsi:type="File" name="OutPutFile" fileName="${mdc:item=outPutFileFullName}"
        layout="${message}"/>

<logger name ="ABC" 
 level="Info" writeTo="OutPutFile"></logger>
我希望这个过程能写100条记录,但它只写了17条记录,但总是不一样,而且不按特定顺序写。

如果我更改
fileName=“${mdc:item=outPutFileFullName}”

在配置文件中设置一个常量值,如
fileName=“${basedir}/logs/Test.log”
然后将所有100条记录写入该文件。知道为什么吗?

MappedDiagnosticsContext使用线程本地存储。Parallel.ForEach将使用其他线程/任务,这些线程/任务无权访问您在MappedDiagnosticsContext中输入的值(因为该值是特定线程的本地值)。如果只为应用程序设置一次此值,那么可能可以使用GlobalDiagnosticsContext

我怀疑正在写入的17项来自主线程(即设置MDC值的同一线程)上的执行。其余的可能发生在不同的线程上。由于MDC中没有这些线程的值,因此文件名为null(或空)

此外,我不明白您希望在配置中使用此产品线实现什么:

<variable name="outPutFileFullName" value=""/>
然后该值将在并行处理启动的所有线程/任务中可用

以下是Jeffrey Richter的一篇文章,描述了CallContext.LogicalSetData的工作原理:

 private  void WriteToFileFromObject(Test obj)
 {
   LoggingService.Info(obj.FileLineNumber.ToString());
 }
<variable name="outPutFileFullName" value=""/>
log4net.LogicalThreadContext.Properties["outputFilename"] = outputFolderFile;