C# 任务循环中获取已处置对象EnterpriseLibrary LogWriter错误
这是一个示例程序(您需要企业库来运行它)。我在一个循环中运行100个任务,它们将一些消息记录到事件日志中。我将生成的任务存储在任务数组中,并在while循环中监视它 问题是满分100,随机任务失败,并给出以下错误。据我所知,任务有自己的状态,所以它们不应该相互干扰,而记录器方法是静态的,所以我不知道我的对象被放置在哪里C# 任务循环中获取已处置对象EnterpriseLibrary LogWriter错误,c#,task-parallel-library,task,enterprise-library,C#,Task Parallel Library,Task,Enterprise Library,这是一个示例程序(您需要企业库来运行它)。我在一个循环中运行100个任务,它们将一些消息记录到事件日志中。我将生成的任务存储在任务数组中,并在while循环中监视它 问题是满分100,随机任务失败,并给出以下错误。据我所知,任务有自己的状态,所以它们不应该相互干扰,而记录器方法是静态的,所以我不知道我的对象被放置在哪里 如果记录器对象是静态的,为什么要处理它 如果我在Task.Run()中的记录器代码周围加上锁(object),它就会正常工作。这是个好主意吗 错误 在Microsoft.Prac
使用系统;
使用System.Collections.Generic;
使用系统诊断;
使用System.Linq;
使用系统文本;
使用系统线程;
使用System.Threading.Tasks;
使用Microsoft.Practices.EnterpriseLibrary.Logging;
使用System.Web.Hosting;
名称空间测试
{
公共类任务进度测试
{
布尔标志=真;
螺纹T;
public static volatile bool IsWorkStarted=false;
公开作废开始()
{
while(旗帜)
{
尝试
{
如果(IsWorkStarted==false)
{
IsWorkStarted=true;
T=新螺纹(定位销);
T.IsBackground=true;
T.开始();
}
}
捕获(例外e)
{
WriteLine(“错误启动线程”);
}
最后
{
线程睡眠(时间跨度从秒(5));
}
}
}
公共工作
{
尝试
{
Task[]\u testasklist=新任务[100];
对于(int i=0;i<100;i++)
{
int localI=i;
_testasklist[localI]=任务。运行(()=>
{
Logger.SetLogWriter(新建LogWriterFactory().Create(),false);
var logEntry=新的logEntry
{
严重性=TraceEventType.信息,
Message=“作业已启动:”,
};
logEntry.Categories.Clear();
logEntry.Categories.Add(“Send.To.EventLog”);
Logger.Write(logEntry);
返回0;
});
}
bool IsAnyTaskPending=true;
int noOfTasks=0;
while(IsAnyTaskPending==true)
{
foreach(变量t在asklist中)
{
//从任务列表中删除已完成的任务
if(t!=null&&t.Status==TaskStatus.RanToCompletion)
{
任务完成任务=t;
var temp=_testasklist.ToList();
//移除温度(t);
//_TENTASKLIST=温度ToArray();
noOfTasks++;
//控制台。写入线(“已完成”);
}
else if(t!=null&&t.Status==TaskStatus.Faulted)
{
控制台写入线(“失败”);
}
}
如果(asklist.Length==0)
{
IsAnyTaskPending=false;
WriteLine(“所有{0}任务完成”,noOfTasks);
}
}
IsWorkStarted=false;
}
捕获(例外e)
{
投掷;
}
}
}
}
问题是每个任务都调用了Logger.SetLogWriter
。内部LogWriter
是一个单例。但是,当您调用SetLogWriter
时,当前内部LogWriter
将被释放:
public static void SetLogWriter(LogWriter logWriter, bool throwIfSet = true)
{
Guard.ArgumentNotNull(logWriter, "logWriter");
var currentWriter = writer;
if (currentWriter != null && throwIfSet)
{
throw new InvalidOperationException(Resources.ExceptionLogWriterAlreadySet);
}
writer = logWriter;
if (currentWriter != null)
{
currentWriter.Dispose();
}
}
因此,每个任务都在处理singleton
LogWriter
,它从其他任务下拉出地毯。解决方案是在调用任务之前boostrapSetLogWriter
一次。问题是每个任务都会调用Logger.SetLogWriter
。内部LogWriter
是一个单例。但是,当您调用SetLogWriter
时,当前内部LogWriter
将被释放:
public static void SetLogWriter(LogWriter logWriter, bool throwIfSet = true)
{
Guard.ArgumentNotNull(logWriter, "logWriter");
var currentWriter = writer;
if (currentWriter != null && throwIfSet)
{
throw new InvalidOperationException(Resources.ExceptionLogWriterAlreadySet);
}
writer = logWriter;
if (currentWriter != null)
{
currentWriter.Dispose();
}
}
因此,每个任务都在处理singleton
LogWriter
,它从其他任务下拉出地毯。解决方案是在调用任务之前boostrapSetLogWriter
一次。问题是每个任务都会调用Logger.SetLogWriter
。内部LogWriter
是一个单例。但是,当您调用SetLogWriter
时,当前内部LogWriter
将被释放:
public static void SetLogWriter(LogWriter logWriter, bool throwIfSet = true)
{
Guard.ArgumentNotNull(logWriter, "logWriter");
var currentWriter = writer;
if (currentWriter != null && throwIfSet)
{
throw new InvalidOperationException(Resources.ExceptionLogWriterAlreadySet);
}
writer = logWriter;
if (currentWriter != null)
{
currentWriter.Dispose();
}
}
因此,每个任务都在处理singletonLogWriter
,它从其他任务下拉出地毯。解决方案是在调用任务之前boostrapSetLogWriter
一次。