protected object MonitorStream(string configKey, string configSource, string streamname) {
lock (this) {
if (_flags[Closed]) {
return null;
}
StreamInfo streamInfo = (StreamInfo) ConfigStreamInfo.StreamInfos[streamname];
if (streamInfo != null) {
if (streamInfo.SectionName != configKey) {
throw new ConfigurationErrorsException(SR.GetString(SR.Config_source_cannot_be_shared, streamname));
}
if (streamInfo.IsMonitored) {
return streamInfo.Version;
}
}
else {
streamInfo = new StreamInfo(configKey, configSource, streamname);
ConfigStreamInfo.StreamInfos.Add(streamname, streamInfo);
}
}
//
// Call the host outside the lock to avoid deadlock.
//
object version = Host.GetStreamVersion(streamname);
StreamChangeCallback callbackDelegate = null;
lock (this) {
if (_flags[Closed]) {
return null;
}
StreamInfo streamInfo = (StreamInfo) ConfigStreamInfo.StreamInfos[streamname];
if (streamInfo.IsMonitored) {
return streamInfo.Version;
}
streamInfo.IsMonitored = true;
streamInfo.Version = version;
if (_flags[SupportsChangeNotifications]) {
if (ConfigStreamInfo.CallbackDelegate == null) {
ConfigStreamInfo.CallbackDelegate = new StreamChangeCallback(this.OnStreamChanged);
}
callbackDelegate = ConfigStreamInfo.CallbackDelegate;
}
}
if (_flags[SupportsChangeNotifications]) {
Host.StartMonitoringStreamForChanges(streamname, callbackDelegate);
}
return version;
}