Unity依赖注入容器似乎是一个众所周知的问题,其中SynchronizedLifetimeManager经常会导致Monitor.Exit方法抛出SynchronizationLockException,然后捕获并忽略它.这对我来说是一个问题,因为我喜欢使用Visual Studio进行调试以打破任何抛出的异常,所以每次我的应用程序启动时,我都会无缘无故地多次打破这个异常.
如何防止抛出此异常?
无论在Web上的其他地方提到此问题,建议通常都涉及更改调试器设置以忽略它.这类似于去看医生并且说:"医生,医生,当我举起它时,我的手臂疼,"被告知,"好吧,停止提高它." 我正在寻找一种解决方案,可以阻止异常被抛出.
SetValue方法中发生异常,因为它假设首先调用GetValue,并调用Monitor.Enter.但是,LifetimeStrategy和UnityDefaultBehaviorExtension类都会定期调用SetValue而不调用GetValue.
我宁愿不必更改源代码并维护我自己的Unity版本,所以我希望有一个解决方案,我可以在容器中添加一些扩展,策略或策略的组合,以确保,如果生命周期管理器是一个SynchronizedLifetimeManager,GetValue始终先调用.
我已经被认为如果多个线程可以访问变量,那么所有对该变量的读取和写入都必须受到同步代码的保护,例如"lock"语句,因为处理器可能会在中途切换到另一个线程写.
但是,我正在使用Reflector查看System.Web.Security.Membership并找到如下代码:
public static class Membership
{
private static bool s_Initialized = false;
private static object s_lock = new object();
private static MembershipProvider s_Provider;
public static MembershipProvider Provider
{
get
{
Initialize();
return s_Provider;
}
}
private static void Initialize()
{
if (s_Initialized)
return;
lock(s_lock)
{
if (s_Initialized)
return;
// Perform initialization...
s_Initialized = true;
}
}
}
Run Code Online (Sandbox Code Playgroud)
为什么s_Initialized字段在锁外读取?另一个线程难道不能同时写入它吗?变量的读写是否是原子的?
在我的C#应用程序中,我使用Microsoft Jet OLEDB数据提供程序来读取CSV文件.连接字符串如下所示:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\Data;Extended Properties="text;HDR=Yes;FMT=Delimited
Run Code Online (Sandbox Code Playgroud)
我使用该连接字符串打开ADO.NET OleDbConnection,并使用以下命令从CSV文件中选择所有行:
select * from Data.csv
Run Code Online (Sandbox Code Playgroud)
当我打开OleDbDataReader并检查它返回的列的数据类型时,我发现堆栈中的某些东西试图根据文件中的第一行数据猜测数据类型.例如,假设CSV文件包含:
House,Street,Town
123,Fake Street,Springfield
12a,Evergreen Terrace,Springfield
Run Code Online (Sandbox Code Playgroud)
为House列调用OleDbDataReader.GetDataTypeName方法将显示该列已被赋予数据类型"DBTYPE_I4",因此从中读取的所有值都将被解释为整数.我的问题是House应该是一个字符串 - 当我尝试从第二行读取House值时,OleDbDataReader返回null.
如何判断Jet数据库提供程序或OleDbDataReader将列解释为字符串而不是数字?
我目前正在将我的Wix项目集成到MSBuild中.我有必要将多个值传递给Wix项目.一个值将起作用(下面示例中的ProductVersion).
<Target Name="BuildWixSetups">
<MSBuild Condition="'%(WixSetups.Identity)'!=''"
Projects="%(WixSetups.Identity)"
Targets="Rebuild" Properties="Configuration=Release;OutputPath=$(OutDir);DefineConstants=ProductVersion=%(WixSetups.ISVersion)" ContinueOnError="true"/>
</Target>
Run Code Online (Sandbox Code Playgroud)
但是,如何将多个值传递给DefineConstants键?我已经尝试了所有'逻辑'分隔符(空格,逗号,分号,管道符号),但这不起作用.
有其他人遇到过这个问题吗?
解决方案不起作用:
为什么不能从其他程序集继承测试来运行:
namespace TestProject.Base
{
[TestClass]
public abstract class TestBaseClass
{
[TestMethod]
public void BaseTest()
{
Assert.IsTrue(false);
}
}
}
Run Code Online (Sandbox Code Playgroud)
测试跑步者
namespace TestProject.UnitTest
{
[TestClass]
public class UnitTest : TestBaseClass
{
}
}
Run Code Online (Sandbox Code Playgroud)
当类在SAME程序集WTF中时,只能运行测试!
是否可以使用NUnit进行上述测试继承并且可以运行?
Sync Framework在逐个表的基础上同步数据,但我的实体在多组相关的父子表中进行了规范化.这会给我的应用程序带来问题,其中父行可能出现在要处理的服务器上,但子行可能不会出现几秒钟.如果我的客户端应用程序和服务器之间存在连接问题,则子行可能不会出现一段时间.
如何设计我的应用程序来处理与父表分开同步的子表?
我正在研究的具体方案是从后端系统接收服务器上的工作订单,以便使用平板电脑或PDA分发给现场工程师.这些工单是大型复杂的实体,可能涵盖了6个表.工程师完成他们的工作,同步结果,服务器将完成的工作订单返回到后端系统.
到目前为止,我自己的一些想法发布在下面.