Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.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# 任务循环中获取已处置对象EnterpriseLibrary LogWriter错误_C#_Task Parallel Library_Task_Enterprise Library - Fatal编程技术网

C# 任务循环中获取已处置对象EnterpriseLibrary LogWriter错误

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

这是一个示例程序(您需要企业库来运行它)。我在一个循环中运行100个任务,它们将一些消息记录到事件日志中。我将生成的任务存储在任务数组中,并在while循环中监视它

问题是满分100,随机任务失败,并给出以下错误。据我所知,任务有自己的状态,所以它们不应该相互干扰,而记录器方法是静态的,所以我不知道我的对象被放置在哪里

  • 如果记录器对象是静态的,为什么要处理它

  • 如果我在Task.Run()中的记录器代码周围加上锁(object),它就会正常工作。这是个好主意吗

  • 错误

    在Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter.get_SyncLock()上 在Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter.ExecuteReadOperation(Action readOperation)上 在Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter.Write(LogEntry日志)上 在Microsoft.Practices.EnterpriseLibrary.Logging.Logger.Write(LogEntry日志)上 在c:\tfs\Report\WWTest\TasksLoggingTest.cs中的WW.Test.TasksLoggingTest.b_u1()处:第79行 在System.Threading.Tasks.Task`1.InnerInvoke()中 在System.Threading.Tasks.Task.Execute()中

    使用系统;
    使用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
    ,它从其他任务下拉出地毯。解决方案是在调用任务之前boostrap
    SetLogWriter
    一次。

    问题是每个任务都会调用
    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
    ,它从其他任务下拉出地毯。解决方案是在调用任务之前boostrap
    SetLogWriter
    一次。

    问题是每个任务都会调用
    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
    ,它从其他任务下拉出地毯。解决方案是在调用任务之前boostrap
    SetLogWriter
    一次。