小编dan*_*dan的帖子

ReaderWriterLockSlim出错

我得到了这个异常
读取锁定被释放而没有被释放.
在System.Threading.ReaderWriterLockSlim.ExitReadLock()at .. GetBreed(String)

下面是访问锁的代码中唯一的位置.如您所见,没有递归.我无法理解如何发生此异常.

static readonly Dictionary<string, BreedOfDog> Breeds 
     = new Dictionary<string,BreedOfDog>();

static BreedOfDog GetBreed(string name)
{
        try
        {
            rwLock.EnterReadLock();
            BreedOfDog bd;
            if (Breeds.TryGetValue(name, out bd))
            {
                return bd;
            }
        }
        finally
        {
            rwLock.ExitReadLock();
        }

        try
        {
            rwLock.EnterWriteLock();
            BreedOfDog bd;
            //make sure it hasn't been added in the interim
            if (Breeds.TryGetValue(t, out bd)
            {
                return bd;
            }
            bd = new BreedOfDog(name); //expensive to fetch all the data needed to run  the constructor, hence the caching

            Breeds[name] = bd; …
Run Code Online (Sandbox Code Playgroud)

c# multithreading readerwriterlockslim

8
推荐指数
1
解决办法
1618
查看次数

使用ThreadStatic而不是DI容器有什么问题

我正在尝试制作一个非常大,非常遗留的项目.

我们的大多数代码都使用了许多静态可用的服务.问题是这些很难嘲笑.他们曾经是单身人士.现在它们是伪单体 - 相同的静态接口,但是函数委托给可以切换的实例对象.像这样:

class ServiceEveryoneNeeds
{
    public static IImplementation _implementation = new RealImplementation();

    public IEnumerable<FooBar> GetAllTheThings() { return _implementation.GetAllTheThings(); }
}
Run Code Online (Sandbox Code Playgroud)

现在在我的单元测试中:

void MyTest()
{
    ServiceEveryoneNeeds._implementation = new MockImplementation();
}
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.在prod中,我们只需要一个实现.但测试并行运行,可能需要不同的模拟,所以我这样做:

class Dependencies
{
     //set this in prod to the real impl
     public static IImplementation _realImplementation;

     //unit tests set these
     [ThreadStatic]
     public static IImplementation _mock;

     public static IImplementation TheImplementation
     { get {return _realImplementation ?? _mock; } }

     public static void Cleanup() { _mock = null; }
}
Run Code Online (Sandbox Code Playgroud)

然后:

class …
Run Code Online (Sandbox Code Playgroud)

.net unit-testing dependency-injection

8
推荐指数
1
解决办法
453
查看次数

忽略DTO的ReSharper命名规则

我设置了ReSharper命名规则,所有属性名称必须是PascalCase.但是,有时我必须使用不同的命名样式来处理序列化.例如,backbone.js期望对象具有名为"id"的Id.

我更喜欢让我的对象符合序列化器的期望,而不是使用花哨的序列化属性来改变命名方式.有没有办法标记我的DTO类,所以resharper不会抱怨它们?怎么样一个公约为基础的方法,如"免除其名称以'DTO’结束或在一个名为'DTO’命名空间中的类?另外,我宁可不使用特殊//disable rule XX的注释块.我觉得他们真的很让人分心

 public class PersonDto
 {
     public int id {get;set;}    //i want resharper to accept this as a valid name,
                                 //  but only in this context.
     public string Name {get;set;}
     public string _CID {get;set;} //some external api is sending me data named like this
 }
Run Code Online (Sandbox Code Playgroud)

c# resharper resharper-6.1

8
推荐指数
1
解决办法
847
查看次数

SqlDataReader查明数据字段是否可为空

如果结果中的给定列可以包含空值,是否有一种方法可以在.NET中确定任何SQL Server结果集?

例如,如果我有这些陈述

Select NullableColumn From MyTable
Run Code Online (Sandbox Code Playgroud)

Select IsNull(NullableColumn, '5') as NotNullColumn From MyTable
Run Code Online (Sandbox Code Playgroud)

我得到一个像这样的datareader:

var cmd = new SqlCommand(statement, connection);
var rdr = cmd.ExecuteReader();
Run Code Online (Sandbox Code Playgroud)

我可以有这样的功能吗?

bool ColumnMayHaveNullData(SqlDataReader rdr, int ordinal)
{
   //????
}
Run Code Online (Sandbox Code Playgroud)

我希望它为第一个语句返回true,对第二个语句返回false.

rdr.GetSchemaTable()不适用于此,因为它返回基础列是否为空,这不是我想要的.datareader上有函数返回字段的底层sql类型,但似乎没有人告诉我它是否为null.

c# ado.net sql-server-2008

7
推荐指数
1
解决办法
624
查看次数

解决单身人士的Autofac会造成瓶颈

我在asp.net MVC应用程序中使用Autofac并遇到了锁定问题.只要服务依赖于单例,该服务就会从根生存期范围中解析出来.这是因为Autofac:

  • 从根范围解析单例组件
  • 从根作用域解析具有必须从root解析的依赖项的任何组件.

此外,当从任何范围解析时,Autofac会锁定该范围.我认为这些都是很好的设计决策.我的问题是行为不端的阶级依赖单身人士而且构造者很慢.这些为任何需要解决单身人士的人造成了瓶颈.

由于这是在MVC应用程序中,每个请求都被映射到一些构造函数注入的MVC控制器.此外,我的大多数控制器都依赖于各种单例服务(日志记录,缓存等).

对于具有快速构造函数的东西,这不是问题.但是,只要请求一个写得不好的类,我的吞吐量就会因为每个新请求都被阻塞在那个行为不当的构造函数上.例如:

鉴于这3个班级

//registered as SingleInstance()
class MySingleton {}

class BadTransient
{
    public BadTransient(MySingleton s)
    { Thread.Sleep(5000); }
}  

class FriendlyTransient {}
Run Code Online (Sandbox Code Playgroud)

解决了

using(var scope = container.BeginLifetimeScope("nested scope"))
{

    //resolves from child scope
    var myFriend = scope.Resolve<FriendlyTransient>(); 

    //resolves from root because it's a singleton
    var singleton = scope.Resolve<MySingleton>(); 

    //resolves from root because it has a singleton dependency. 
    //**** this locks the root scope for 5 seconds
    //****   no one else can resolve singletons. …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc autofac

7
推荐指数
1
解决办法
4802
查看次数

为什么.NET不记录StackOverflow异常的堆栈跟踪?

如果我写这个:

class Program
{
    static void Main(string[] args)
    {
        throw new Exception("lol");
    }
}
Run Code Online (Sandbox Code Playgroud)

并从命令行运行exe,我在事件日志中得到两个条目.一个是应用程序错误,表示存在未处理的异常,另一个包含堆栈跟踪,源代码为.NET Runtime.

如果我写这个:

class Program
{
    static void Main(string[] args)
    {
        Recurse4Evr();
    }

    static void Recurse4Evr()
    {
        Recurse4Evr();
    }
}
Run Code Online (Sandbox Code Playgroud)

我只在事件日志中输入一个条目,它表示应用程序错误,并且存在堆栈溢出异常.堆栈跟踪没有第二个条目,所以它基本上没用.

为什么不记录堆栈跟踪?如果我设置DebugDiag并将其附加到我的进程然后存在堆栈溢出,则DebugDiag能够记录堆栈跟踪.显然,堆栈跟踪以某种方式可用于外部世界.如果运行时因为检测到堆栈溢出而终止进程,那么它也知道堆栈是什么.

在具有许多复杂交互的大型应用程序中,通常无法重新创建导致堆栈溢出的条件.在这种情况下,堆栈跟踪是弄清楚发生了什么的唯一方法.为什么微软决定记录这些信息并不重要?是否有合理的设计决策并不明显?

.net stack-overflow

6
推荐指数
1
解决办法
853
查看次数

resharper自定义模式替换与否定等式表达式

我在resharper中有一个规则来查找对Nullable.HasValue的调用

T? foo; 
//...

if(foo.HasValue)
{}

//And it offers to replace with a comparison directly with null:

if(foo != null)
{}
Run Code Online (Sandbox Code Playgroud)

这很有效,但当遇到否定时.HasValue,结果有点奇怪.

if(!foo.HasValue) {}

//is replaced with
if(!(foo != null)) {}
Run Code Online (Sandbox Code Playgroud)

然后resharper希望我简化声明 if(foo == null)

//ideally it would automatically get to this without the extra step:
if(foo == null) {}
Run Code Online (Sandbox Code Playgroud)

该规则定义为:

type:     System.ValueType or derived
nullable: expression of type System.Nullable<$type$>

search pattern:
$nullable$.HasValue

replace pattern:
$nullable$ != null
Run Code Online (Sandbox Code Playgroud)

('替换后格式'和'缩短参考'都被选中)

有没有办法可以编写这个规则,以便ReSharper智能地处理它?我尝试制定第二条规则!$nullable$.HasValue,但这会导致两条规则匹配,这使得工具提示建议看起来令人困惑:replace with == nullreplace …

c# resharper

6
推荐指数
1
解决办法
768
查看次数

我可以用什么方法来检测机器人?

仅仅因为软件是自动化的并不意味着它会遵守你的robots.txt.有哪些方法可用于检测何时有人抓取您的网站?假设您的网站有100个页面,并且值得抓取或DDOS.

这是一个愚蠢的想法,我可能不起作用:给每个用户一个具有唯一值的cookie,并使用cookie知道有人在做第二个/第三个/等等请求.这可能不起作用,因为爬虫可能不接受cookie,因此在这个方案中,机器人看起来像每个请求的新用户.

有没有人有更好的想法?

c# asp.net iis

5
推荐指数
1
解决办法
488
查看次数

Google Maps地理编码api不一致

我正在尝试对这个地址进行地理编码"188th street&third avenue,bronx NY"

如果您通过maps api v3地理编码器运行此地理编码查询,则会返回10个左右的结果,其中没有一个位于纽约.

http://maps.google.com/maps/api/geocode/xml?sensor=false&address=188th%20street%20&%20third%20avenue,%20bronx%20NY

如果您将相同的地址粘贴到Google地图中,则会直接转到布朗克斯的交叉点.

这些结果是否存在不一致的原因,是否有一种方法可以让地理编码器给我正确的结果,或者至少是同一状态的某些东西?

(起初我认为这是因为'第三'被拼写出来,所以我用'3rd'替换它.我仍然得到10个结果,其中一个在纽约.但是,它是在皇后而不是布朗克斯.)

google-maps-api-3

5
推荐指数
1
解决办法
2423
查看次数

SqlDataReader 的转换问题

假设我有这个 sql 语句,并且我已经执行了 sql 命令来获取数据读取器:

"select 1 union select 2"
//.....
var rdr = cmd.ExecuteReader();
Run Code Online (Sandbox Code Playgroud)

现在我想读取第一行第一列中的值:

var myInt = (int)rdr.GetValue(0); //great this works
var myLong = (long)rdr.GetValue(0); //throws cast exception, even though you can cast int to long
Run Code Online (Sandbox Code Playgroud)

因此,您在 C# 中转换的类型似乎需要与 SQL 类型完全匹配。IE如果sql类型是bigint,则只能强制转换为long。如果sql类型是int,则只能强制转换为int。没有混搭...

我只是想得到一些可以工作的东西,不管 c# 要求的整数类型和 sql 返回的类型如何,只要理论上你可以将一个转换为另一个。因此,如果 SQL Server 给我一个浮点类型,并且我要求一个 int,我想要通过该转换获得的截断 int。

我的目标是使此功能与泛型一起工作,因此当泛型参数与 sql server 中的数据类型不完全匹配时,我可以让此函数工作:

List<T> GetFirstColumn<T>(string sql) where T : struct
{
    //get connection, execute reader
    // loop: 
    //    lst.Add(  (T) rdr.GetValue(0));
}
Run Code Online (Sandbox Code Playgroud)

我希望这适用于这两个语句:

var sql1 = …
Run Code Online (Sandbox Code Playgroud)

c# sql-server ado.net

4
推荐指数
1
解决办法
1万
查看次数

单行if语句的Resharper格式

ReSharper中是否有一个设置可以在一行上使用括号块自动格式化单语句IF语句?这是在ReSharper 6.1上.

//What I want
if(tired)
{ Sleep(); }
else
{ Party(); }


//what I get 
if(tired)
{
    Sleep();
}
else
{
    Party();
}
Run Code Online (Sandbox Code Playgroud)

c# resharper

2
推荐指数
1
解决办法
1055
查看次数