- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
更新问题(正确指出问题)
我正在使用一个库,它实现了一个派生自 ApplicationSettingsBase
的类。
namespace MyLib {
public sealed class GlobalLibSettings : ApplicationSettingsBase
{
[UserScopedSetting, DefaultSettingValue("true")]
public bool SimpleProperty{
get { return (bool) this["SimpleProperty"]; }
set {
this["SimpleProperty"] = value;
Save();
}
}
}
}
现在我在另一个项目中使用这个库。这些项目还包含至少一个派生自 ApplicationSettingsBase
的类。
namespace MyProject {
public sealed class ProjectSettings : ApplicationSettingsBase
{
[UserScopedSetting, DefaultSettingValue("true")]
public bool AnotherProperty{
get { return (bool) this["AnotherProperty"]; }
set {
this["AnotherProperty"] = value;
Save();
}
}
}
}
现在这两个派生自 ApplicationSettingsBase
的类将它们的属性存储到相同的 user.config
文件中。应用程序和库使用多个任务,如果两个任务同时执行(例如)属性 setter ,我会得到以下异常。两个任务都尝试同时执行写入操作...
System.Configuration.ConfigurationErrorsException occurred
BareMessage=Beim Laden einer Konfigurationsdatei ist ein Fehler aufgetreten.: Der Prozess kann nicht auf die Datei "... _xneb3g43uoxqiagk4ge5e4hea1vxlina\1.0.4.862\user.config" zugreifen, da sie von einem anderen Prozess verwendet wird.
Filename=..._xneb3g43uoxqiagk4ge5e4hea1vxlina\1.0.4.862\user.config
HResult=-2146232062
Line=0
Message=Beim Laden einer Konfigurationsdatei ist ein Fehler aufgetreten.: Der Prozess kann nicht auf die Datei "..._xneb3g43uoxqiagk4ge5e4hea1vxlina\1.0.4.862\user.config" zugreifen, da sie von einem anderen Prozess verwendet wird. (..._xneb3g43uoxqiagk4ge5e4hea1vxlina\1.0.4.862\user.config)
Source=System.Configuration
StackTrace:
bei System.Configuration.ConfigurationSchemaErrors.ThrowIfErrors(Boolean ignoreLocal)
InnerException:
HResult=-2147024864
Message=Der Prozess kann nicht auf die Datei "_xneb3g43uoxqiagk4ge5e4hea1vxlina\1.0.4.862\user.config" zugreifen, da sie von einem anderen Prozess verwendet wird.
Source=mscorlib
StackTrace:
bei System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
bei System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
bei System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
bei System.Configuration.Internal.InternalConfigHost.StaticOpenStreamForRead(String streamName)
bei System.Configuration.Internal.InternalConfigHost.System.Configuration.Internal.IInternalConfigHost.OpenStreamForRead(String streamName, Boolean assertPermissions)
bei System.Configuration.Internal.InternalConfigHost.System.Configuration.Internal.IInternalConfigHost.OpenStreamForRead(String streamName)
bei System.Configuration.ClientConfigurationHost.OpenStreamForRead(String streamName)
bei System.Configuration.BaseConfigurationRecord.RefreshFactoryRecord(String configKey)
我可以用以下场景重现它:
var settings1 = new GlobalLibSettings ();
var settings2 = new ProjectSettings ();
Task.Factory.StartNew(()=>{
while(true) settings1.SimpleProperty = !settings1.SimpleProperty;
});
Task.Factory.StartNew(()=>{
while(true) settings2.AnotherProperty = !settings2.AnotherProperty;
});
现在我正在寻找一种实现来保护对 user.config
文件的访问。
解决方案:
我找到了可行的解决方案。 CustomApplicationSettingsBase
锁定并发任务。
公共(public)密封类 GlobalLibSettings : CustomApplicationSettingsBase
和
公共(public)密封类 ProjectSettings : CustomApplicationSettingsBase
with:
namespace MyLib {
public static class LockProvider
{
public static object AppSettingsLock { get; } = new object();
}
public class CustomApplicationSettingsBase : ApplicationSettingsBase
{
public override object this[string propertyName] {
get {
lock (LockProvider.AppSettingsLock) {
return base[propertyName];
}
}
set {
lock (LockProvider.AppSettingsLock) {
base[propertyName] = value;
}
}
}
public override void Save() {
lock (LockProvider.AppSettingsLock) {
base.Save();
}
}
public override void Upgrade() {
lock (LockProvider.AppSettingsLock) {
base.Upgrade();
}
}
}
}
感谢您的帮助!
最佳答案
很多不喜欢 System.Configuration,但它并没有弄错这个细节。您可以在 Reference Source 中看到的内容,文件打开方式:
return new FileStream(streamName, FileMode.Open, FileAccess.Read, FileShare.Read);
如此简单的读取访问和使用 FileShare.Read 也允许其他任何人读取文件。所以任何线程都可能触发这段代码,你无法得到文件共享异常。
所以你试过的方案并不能解决问题。使用提供的信息很难找到另一种解释。很难在隐藏得很好的文件上发生共享冲突。唯一合理的解释是另一个线程正在同一时间写入文件。换句话说,执行 Save() 方法。
你一定非常倒霉。但这在技术上是可行的。使用 Debug > Windows > Threads 调试器窗口查看其他线程在做什么,您应该在它们的堆栈跟踪之一中看到 Save() 方法调用。唯一可能的怪癖是环境问题,不稳定的反恶意软件可以在扫描文件时任意使文件无法访问。
最后但并非最不重要的一点是,您为完成这项工作所做的工作根本不明显。只有解决方案的 EXE 项目可以使用 .config 文件。需要大量不明显的花招才能让 DLL 使用设置。我们不知道您做了什么,请务必使用这些详细信息更新您的问题。真的最好不要这样做。
关于c# - ApplicationSettingsBase ConfigurationErrorsException 多个程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41220863/
我有一个在本地运行良好的应用程序,但是在部署时我看到了错误: Exception information: Exception type: ConfigurationErrorsExcepti
我正在为我的 MVC 应用程序使用 Stackexchange redis,并且我经常收到如下所示的 w3wp 异常。它不会在生产中发生,所以我想知道这是否与 Visual studio 有关? 使用
更新 - 现在不需要回答这个问题,我已经在下面解决了。 您好,我正在尝试在 .NET 中实现自定义跟踪监听器,但在通过配置文件添加跟踪监听器时遇到问题。 我在堆栈溢出上找到了类似的帖子,但它似乎没有帮
更新问题(正确指出问题) 我正在使用一个库,它实现了一个派生自 ApplicationSettingsBase 的类。 namespace MyLib { public sealed clas
我想添加一个行为扩展,以便我的服务类将使用 Ninject 实例化。我创建了一个继承自BehaviorExtensionElement 的类,并将其注册到我的App.config 中。我看不到任何明显
我正在创建一个类来从配置文件中读取/写入自定义配置。这里是配置文件
应用:工业 PC W7 旗舰版 64 位 问题:我们经常在断电(切断)时遇到问题,看起来像我们使用的这种中断损坏文件设置如下:Properties.Settings.Default. 当应用程序再次启
我正在限制用户可以从 Web.config 上传到站点的文件大小。正如解释的那样 here ,如果不接受大小,它应该抛出 ConfigurationErrorsException。我试图从上传请求的操
出于测试目的,我安装了一个干净的 XP 虚拟机,仅应用了 .NET 3.5 SP1 可再发行组件。 当我尝试启动我们的 WinForms 应用程序时,出现以下异常: System.Configurat
Unrecognized element 'setting'. (C:\Dev\DOT.NET\AutoPay\ibeam.config line 15) AppInfo.Sections.Get("
我有一个简单的控制台应用程序,旨在在我运行它时读取自定义配置异常(下面的代码) 我在调用 ConfigurationManager.GetSection 时收到带有消息“无效键值”的 Configur
我正在尝试测试网上商店的页面,我想使用 mollie 的 API 客户端。 https://github.com/foxip/mollie-api-csharp#how-to-use-the-api-
我有一个具有自定义配置部分的 Windows 服务。在 configSectionHandler 类中,我使用属性的属性来验证这样的设置: //ProcessingSleepTime Prop
嘿大家, 在“ return((string)(this [” TargetDir“])); ”上进行编译时,如何解决编译器错误: System.Configuration.Configurati
我正在尝试访问 Windows 服务应用程序中 app.config 的自定义部分。 我是这样定义的 ... 出现以下错误 An error occurred creating
我在App.Config中有以下configSection。
在 WCF 应用程序中,我有一些自定义配置类用于 app.config .但是,我从 WCF 服务主机获得以下堆栈跟踪(它尝试在 WCF 服务的构造函数中检索自定义配置): System.Reflec
一些背景:我有一个带有 5 个 Web 引用的 Windows 服务,在开发、测试、QC 的几个环境中一切都很好。开发和测试正在运行 windows 2003、QC 和 PROD windows 20
有谁知道这个特殊的异常意味着什么以及如何解决它? 请注意,我并不是在“异常”对话框中寻求有关抑制它的帮助。如果可能的话,我想了解它的根本原因以及如何解决原因本身。 谢谢。 附言 导致 FCE 的行是:
我正在尝试在 .net Core 2.2 应用程序中使用 ConfigurationErrorsException。我在这里查看了文档:https://learn.microsoft.com/en-u
我是一名优秀的程序员,十分优秀!