Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Multithreading 事件日志间歇性异常_Multithreading_Event Log - Fatal编程技术网

Multithreading 事件日志间歇性异常

Multithreading 事件日志间歇性异常,multithreading,event-log,Multithreading,Event Log,我在使用C#和.Net的EventLog类写入Windows事件日志的一些代码中遇到了间歇性问题 基本上,这段代码每天都能正常工作,但偶尔会出现如下错误: static readonly object lockObj = new object(); public static void LogEmail(string to, string type) { string message = String.Format("{0}\t{1}\t{2}", Da

我在使用C#和.Net的
EventLog
类写入Windows事件日志的一些代码中遇到了间歇性问题

基本上,这段代码每天都能正常工作,但偶尔会出现如下错误:

    static readonly object lockObj = new object();

    public static void LogEmail(string to, string type)
    {
        string message = String.Format("{0}\t{1}\t{2}", DateTime.Now, to, type);
        Log(message, "LB_Email", EventLogEntryType.Information);
    }

    private static void Log(string message, string logName, EventLogEntryType type)
    {
        lock (lockObj)
        {
            using (EventLog aLog = new EventLog())
            {
                aLog.Source = logName;
                aLog.WriteEntry(message, type);
            }
        }
    }
“System.ArgumentException:只有 自定义日志的前八个字符 名字是有意义的,而且是有意义的 系统上已存在另一个日志 使用 给定的名称。给定的名称: “应用程序”,现有日志的名称: “应用程序”

我可以从我们日志上的其他信息中看出,受影响的调用堆栈是这样的-您可以清楚地看到,我实际上正在尝试写入现有的
LB_电子邮件
log(
LogEmail
首先被调用):

一旦错误开始发生,对我们的
LB_电子邮件
eventlog的访问似乎以某种方式被锁定-查看特定eventlog上的属性显示大多数信息变灰且不可更改,其他进程似乎也无法登录到该日志。然而,我通过一个try-catch看到了这个错误(它使用了上面相同的日志方法),这个try-catch记录到一个“LB_error”日志中,并按照预期继续工作

我从多线程应用程序调用此代码,但我无法确定上面的代码是否是线程安全的

我还可以确认,在终止并重新启动进程后,有问题的日志再次正常工作。。。而且它有适当的设置,当它满的时候可以重用条目。。。虽然我不认为这是问题所在

我很想听听你的想法和建议。

声明:

您只能使用源代码进行写入 一次复制一个日志

因此,我怀疑这个问题是由多线程应用程序在给定时间对同一源多次调用
Log
方法引起的

我建议您使用线程安全的单例类来记录这些事件,而不是使用静态类(或方法)

编辑:

乔恩·斯基特对单身汉有着深刻的印象

如果不想实现单例类,可以执行以下操作:

    static readonly object lockObj = new object();

    public static void LogEmail(string to, string type)
    {
        string message = String.Format("{0}\t{1}\t{2}", DateTime.Now, to, type);
        Log(message, "LB_Email", EventLogEntryType.Information);
    }

    private static void Log(string message, string logName, EventLogEntryType type)
    {
        lock (lockObj)
        {
            using (EventLog aLog = new EventLog())
            {
                aLog.Source = logName;
                aLog.WriteEntry(message, type);
            }
        }
    }
希望这能解决您的问题。

谢谢布鲁诺

那么,我是否错误地认为Log方法中的EventLog实例与不同线程中相同方法调用中的EventLog实例不同?或者我只是对静态方法中的对象实例感到困惑

好的,我有几个到Log(…)方法的包装器方法。如果我将Log方法移动到一个singleton类中,更改了包装器(LogEmail、LogXxxx、LogYyy等),那么我可以保持我的Log.Zzzz接口不变,但利用当前日志中singleton LogSingleton.Instance.Log(…)的安全性。或者因为我想写入不同的日志,每个日志是否都需要自己的LogSingletonXxx

你可以看出我很困惑:)是的-我真的很感激一些同步代码:)


Nij

感谢Bruno的链接和最近的编辑。。。具有讽刺意味的是,我今天在寻找其他信息来源时发现了这篇文章!在NijNij中,EventLog类下面的代码不知道如何每次处理同一源的多个请求。即使创建不同的EventLog实例,它们也必须与Source属性表示的相同静态资源竞争。