Search code examples
c#.netc#-4.0event-handlingevent-log

ConfigurationErrorsException- The process cannot access the file 'c:\eventlog.config' because it is being used by another process


Team,

I have this piece of code which invariably ties up itself in a sort of race condition especially when two or more resources are trying to write to eventlog.config file simultaneously. I have googling out several channels but not able to solve this error out. Can anyone help me to modify this code so that i can remove the race condition.

private void UpdateLastEventId(IList<EventLogEntry> entries)
    {
        if (entries.Count > 0)
        {
            EventLogEntry lastEntry = entries[entries.Count - 1];

            Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            var configSettings = config.AppSettings.Settings;

            string key = string.Format(CultureInfo.InvariantCulture, "{0}|{1}", _eventLogFilter.EventLog, _eventLogFilter.MD5Hash);
            if (configSettings[key] == null)
            {
                configSettings.Add(key, lastEntry.Index.ToString(CultureInfo.InvariantCulture));
            }
            else
            {
                configSettings[key].Value = lastEntry.Index.ToString(CultureInfo.InvariantCulture);
            }
            config.Save(ConfigurationSaveMode.Modified);//Error seems to happen here
        }
    }

Solution

  •     private static readonly object _configLogLock = new object();
        private void UpdateLastEventId(IList<EventLogEntry> entries)
        {
            if (entries.Count > 0)
            {
                EventLogEntry lastEntry = entries[entries.Count - 1];
    
                lock (_configLogLock)
                {
                    Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                    var configSettings = config.AppSettings.Settings;
    
                    string key = string.Format(CultureInfo.InvariantCulture, "{0}|{1}", _eventLogFilter.EventLog, _eventLogFilter.MD5Hash);
                    if (configSettings[key] == null)
                    {
                        configSettings.Add(key, lastEntry.Index.ToString(CultureInfo.InvariantCulture));
                    }
                    else
                    {
                        configSettings[key].Value = lastEntry.Index.ToString(CultureInfo.InvariantCulture);
                    }
                    config.Save(ConfigurationSaveMode.Modified);//Error seems to happen here
                }
            }
        }