在更改为外部配置文件时刷新内存中的配置时出现异常

时间:2010-12-21 18:48:14

标签: c# configuration windows-services app-config

我有一个Windows服务,它从外部文件读取配置设置,该文件位于与Windows服务可执行文件的路径不同的路径上。 Windows服务使用FileSystemWatcher来监视外部配置文件的更改,当配置文件发生更改时,它应该通过从配置文件中读取更新的设置来刷新内存中的设置。但这是我得到异常“ConfigurationErrorsException”的地方,消息是“为appSettings创建配置部分处理程序时出错:进程无法访问文件'M:\ somefolder \ WindowsService1.Config',因为它正在被使用另一个过程。“内部异常实际上是“IOException”,具有相同的消息。这是代码。我不确定代码有什么问题。请帮忙。

protected void watcher_Changed(object sender, FileSystemEventArgs e)
{
    ConfigurationManager.RefreshSection(ConfigSectionName);
    WriteToEventLog(ConfigKeyCheck);

    if (FileChanged != null)
        FileChanged(this, EventArgs.Empty);
}

private void WriteToEventLog(string key)
{
    if (EventLog.SourceExists(ServiceEventSource))
    {
        EventLog.WriteEntry(ServiceEventSource,
                            string.Format("key:{0}, value:{1}", key, ConfigurationManager.AppSettings[key]));                
    }
}

2 个答案:

答案 0 :(得分:1)

如果在每次检测到更改时尝试重新读取配置部分,您应该会发生IO异常。例如,可以锁定文件(如您的情况),或者只能部分完成写入。您应该将代码放在try / catch块中,捕获IOException s(可能更多),然后稍后重试刷新,可能是在计时器结束后。

答案 1 :(得分:0)

根据雅各布的建议更改了代码,现在可以正常工作(我尝试只捕获IOException,但它没有用)。如果异常发生超过3次,则吞下异常,但是从配置文件中的任何后续读取都将抛出未处理的异常,迫使服务停止。希望这种情况不会发生。

private void WriteToEventLog(string key)
{
    try
    {
        if (EventLog.SourceExists(ServiceEventSource))
        {
            EventLog.WriteEntry(ServiceEventSource,
                                string.Format("key:{0}, value:{1}", key, ConfigurationManager.AppSettings[key]));
            _configReadCount = 0;
        }
    }
    catch (Exception)
    {
        System.Threading.Thread.Sleep(TimeSpan.FromMinutes(1)); //sleep for a minute and try again
        _configReadCount++;
        if (_configReadCount <= 3) //try 3 times 
            WriteToEventLog(ConfigKeyCheck);
    }

}