小编Nij*_*Nij的帖子

Debug.Assert与特定的抛出异常

我刚刚开始浏览John Robbins的"调试MS .Net 2.0应用程序",并且因为他对Debug.Assert(...)的传福音而感到困惑.

他指出,良好实现的Asserts会在某种程度上存储错误状态,例如:

Debug.Assert(i > 3, "i > 3", "This means I got a bad parameter");
Run Code Online (Sandbox Code Playgroud)

现在,就个人而言,我似乎很疯狂,他如此喜欢在没有真正明智的"商业逻辑"评论的情况下重述他的测试,也许"因为flobittyjam widgitification过程,我必须永远不会发生i <= 3".

所以,我认为我认为Asserts是一种低级别的"让我保护我的假设"的东西......假设一个人认为这是一个只需要在调试中做的测试 - 即你保护自己不受同事的影响和未来的程序员,并希望他们实际测试的东西.

但是我没有得到的是,他继续说除了正常的错误处理之外你还应该使用断言; 现在我设想的是这样的:

Debug.Assert(i > 3, "i must be greater than 3 because of the flibbity widgit status");
if (i <= 3)
{
    throw new ArgumentOutOfRangeException("i", "i must be > 3 because... i=" + i.ToString());
}
Run Code Online (Sandbox Code Playgroud)

我通过Debug.Assert重复错误条件测试获得了什么?如果我们谈论一个非常重要的计算的仅调试双重检查,我想我会得到它...

double interestAmount = loan.GetInterest();
Debug.Assert(debugInterestDoubleCheck(loan) == interestAmount, "Mismatch on interest calc");
Run Code Online (Sandbox Code Playgroud)

...但是我没有得到参数测试,这肯定值得检查(在DEBUG和Release版本中)......或者不是.我错过了什么?

c# assert exception-handling

33
推荐指数
3
解决办法
9389
查看次数

由于Pending Changes,Update-Database失败,但Add-Migration创建了重复迁移

我正在使用Entity Framework 5.0 Code First Migrations,并且遇到运行Update-Database的问题.它说有待更改的模型; 但它应该是最新的,所以我跑了

Add-Migration SomeMigrationName
Run Code Online (Sandbox Code Playgroud)

并且它创建了一个文件...但是,它创建的文件与先前的迁移基本相同(如果我再次尝试在该文件上更新数据库,则会因尝试删除非文件而失败)存在的约束).此外,我已经能够确认已经根据数据库中的数据模型以及__MigrationHistory表中的记录的存在运行了"原始"迁移!

如果我删除整个数据库,并自动或手动再次运行所有迁移,我遇到同样的问题.

我拥有的"原始"迁移文件如下:

public partial class RenameLinkColumns : DbMigration
{
    public override void Up()
    {
        DropForeignKey("dbo.Listing", "OfferedByUserId", "dbo.User");
        DropIndex("dbo.Listing", new[] { "OfferedByUserId" });
        AddColumn("dbo.Listing", "ListedByUserId", c => c.Int(nullable: false));
        AddForeignKey("dbo.Listing", "ListedByUserId", "dbo.User", "UserId", cascadeDelete: true);
        CreateIndex("dbo.Listing", "ListedByUserId");
        DropColumn("dbo.Listing", "OfferedByUserId");
    }

    public override void Down()
    {
        AddColumn("dbo.Listing", "OfferedByUserId", c => c.Int(nullable: false));
        DropIndex("dbo.Listing", new[] { "ListedByUserId" });
        DropForeignKey("dbo.Listing", "ListedByUserId", "dbo.User");
        DropColumn("dbo.Listing", "ListedByUserId");
        CreateIndex("dbo.Listing", "OfferedByUserId");
        AddForeignKey("dbo.Listing", "OfferedByUserId", "dbo.User", "UserId", cascadeDelete: true);
    }
} …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework ef-migrations

28
推荐指数
1
解决办法
8800
查看次数

.Net和Windows的StatsD和类似Graphite的工具

我最近发送了这个链接到Statsd,这对我们来说是一个有趣的工具,可以监控我们产品的各个方面,但由于PHP和非Windows工具集,这对我们来说很难卖.(这个问题询问如何在Windows上安装,没有答案...)

任何人都可以推荐可能提供类似低开销系统监控的Windows/.Net工具集吗?在合理的范围内,支付工具集应该不是问题.

我确实发现这个看起来非常有趣的微软页面,但是说实话,它没有那么多很酷的图表显示出最终结果会很好的东西:)

您的经验和对方向的想法将受到赞赏:我认为我们的最终目标是"墙板",例如通过几个关键图表或视图循环的大屏幕,以便整个团队能够理解和监控我们支持的产品的一些关键指标.我们的客户使用SQL Server Reporting Services,但他们的报告似乎主要是统计数据,而且图形很少.

.net c# health-monitoring

20
推荐指数
3
解决办法
7949
查看次数

对具有索引的查询,数据库读取变化很大

我有一个具有适当索引的查询,并显示在查询计划中,估计的子树成本约为1.5.该计划显示了一个Index Seup,然后是Key Lookup - 这对于一个预期从5到20行的一组中返回1行的查询很好(即Index Seek应该找到5到20行之间,以及5到20之后)关键查找,我们应该返回1行).

以交互方式运行时,查询几乎立即返回.但是,今天早上的数据库跟踪显示了来自live(一个Web应用程序)的运行时间变化很大; 通常,查询正在进行<100 DB Reads,并且有效地运行0 ...但是我们正在进行一些消耗> 170,000 DB Reads的运行,并且运行时间高达60s(大于我们的超时值).

什么可以解释磁盘读取的这种变化?我尝试以交互方式比较查询,并使用来自两个并行运行的实际执行计划,其中过滤值取自快速和慢速运行,但是交互式地显示这些计划在使用的计划中没有任何差异.

我还试图找出可以锁定这个查询的其他查询,但我不确定这会如何影响数据库读取......并且无论如何这个查询往往是我的跟踪日志中运行时最差的.

更新:以下是交互式运行查询时生成的计划示例:

替代文字

忽略"缺失索引"文本.这事实,改变目前的指标可以允许用较少的查找更快的查询,但不是这里的问题(已经有合适的索引).这是一个实际执行计划,我们可以看到实际行数等数字.例如,在Index Seek上,实际行数为16,I/O成本为0.003.Key Lookup上的I/O成本相同.

更新2:此查询的跟踪结果为:

exec sp_executesql N'select [...column list removed...] from ApplicationStatus where ApplicationGUID = @ApplicationGUID and ApplicationStatusCode = @ApplicationStatusCode;',N'@ApplicationGUID uniqueidentifier,@ApplicationStatusCode bigint',@ApplicationGUID='ECEC33BC-3984-4DA4-A445-C43639BF7853',@ApplicationStatusCode=10
Run Code Online (Sandbox Code Playgroud)

使用Gentle.Framework SqlBuilder类构造查询,该类构建参数化查询,如下所示:

SqlBuilder sb = new SqlBuilder(StatementType.Select, typeof(ApplicationStatus));
sb.AddConstraint(Operator.Equals, "ApplicationGUID", guid);
sb.AddConstraint(Operator.Equals, "ApplicationStatusCode", 10);
SqlStatement stmt = sb.GetStatement(true);
IList apps = ObjectFactory.GetCollection(typeof(ApplicationStatus), stmt.Execute());
Run Code Online (Sandbox Code Playgroud)

database sql-server performance sql-server-2008 sql-server-2008-r2

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

了解.Net配置选项

我对.Net v2中dll,ASP.net网站等的.Net配置的各种配置选项感到困惑 - 尤其是在考虑配置文件在链接的UI /最终用户端的影响时.

因此,例如,我使用的一些应用程序使用我们访问的设置:

string blah = AppLib.Properties.Settings.Default.TemplatePath;
Run Code Online (Sandbox Code Playgroud)

现在,这个选项似乎很酷,因为成员是强力键入的,我将无法输入Visual Studio 2005 IDE中不存在的属性名称.我们在命令行可执行项目的App.Config中得到这样的行:

<connectionStrings>
    <add name="AppConnectionString" connectionString="XXXX" />
    <add name="AppLib.Properties.Settings.AppConnectionString" connectionString="XXXX" />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)

(如果我们没有第二个设置,那么将一个调试dll发布到live box的人可能已经嵌入了调试连接字符串 - eek)

我们也有像这样访问的设置:

string blah = System.Configuration.ConfigurationManager.AppSettings["TemplatePath_PDF"];
Run Code Online (Sandbox Code Playgroud)

现在,这些看起来很酷,因为我们可以从dll代码或exe/aspx代码访问设置,我们在Web或App.config中需要的只是:

<appSettings>
   <add key="TemplatePath_PDF" value="xxx"/>
</appSettings>
Run Code Online (Sandbox Code Playgroud)

但是,当然可能没有在配置文件中设置值,或者字符串名称可能输入错误,因此我们遇到了一组不同的问题.

所以......如果我的理解是正确的,那么前面的方法会给出强大的输入,但是在dll和其他项目之间分配不好的值.后者提供更好的共享,但键入较弱.

我觉得我必须遗漏一些东西.目前,我甚至不关心应用程序能够将值写回配置文件,加密或类似的东西.此外,我已经决定存储任何非连接字符串的最佳方法是在数据库中...然后我要做的另一件事就是在数据库连接问题时将电话号码存储给文本人员,所以他们必须存放在DB外面!

.net c# configuration

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

数据验证和验证之间有什么区别?

我对过去雇主的回忆是,他们将两者区分如下:

  • 验证是在非常基本的意义上检查数据是否合适的过程; 例如,日期字段中的数据可以转换为日期,或者数字字段中的字符可以转换为适当类型的数字;
  • 验证是根据您在界面上强加的某些其他"业务"规则检查类型化数据的过程 - 例如,"出生日期"字段表示某个年龄范围内的申请人.

这些记忆与维基百科关于该主题的文章没有关系,也没有与BBC BiteSize Revision文章相关.

那么什么是共识:例如,当我检查Xml输入时,人们是否关心调用哪些方法和过程?

我在做什么的时候我在做什么

  1. 检查日期字段是否包含可转换为C#DateTime的字符;
  2. 检查DateTime是否在适当的日期范围内存储在SQL Server中;
  3. 检查出生日期是否指示18岁以上但65岁以下的客户?

c# validation verification

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

多线程WebRequest调用和争用

我正在运行一个多线程的C#控制台应用程序.核心流程检索要处理的一些数据,将其拆分为可配置数量的较小数据集,然后生成相同数量的线程以处理每个数据子集.

要处理单个记录,线程必须使用WebRequest类和POST方法调用Web服务.查询与GetRequestStream()一起发送,并使用GetResponse()检索响应.

在伪代码中,例程看起来像这样:

prepare WebRequest data;
* get time (start-of-Processing);
Stream str = request.GetRequestStream();
Write data to stream;
stream.Close();
WebResponse resp = request.GetResponse();
* get time (response-received);
process response;
finally close response stream;
Run Code Online (Sandbox Code Playgroud)

时序数据表明,当我们将数据分成4个以上的线程时,整个过程的吞吐量不会提高,有时甚至会下降.来自Web服务的定时数据保持其性能保持不变.

  • 在4个线程中,我们发送数据和检索响应流的明显开销大约为一秒.
  • 当我们运行超过4个线程时,平均值会上升,最大值会遇到几十秒!

今天我能够运行两个独立的进程,每个进程运行4个线程(但基本上确保每个线程仍在独特的数据上运行).这次,我们的整体吞吐量几乎翻了一番,每个流程都有大约一秒钟的稳定时间.

这让我相信我们对WebRequest类的资源有某种限制; 但它是每个进程的限制,而不是机器限制.我知道我们可以使用BeginGetRequestStream和BeginGetResponse异步调用我们的调用,但我怀疑如果我们实际上达到某种资源限制会产生积极影响吗?!

我应该注意什么才能使我们在单一过程中提高分割数量而不会降低性能?

c# multithreading httpwebrequest

3
推荐指数
1
解决办法
2520
查看次数