我有一个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]));
}
}
答案 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);
}
}