小编Joh*_*ohn的帖子

连接/聚合字符串的最佳方式

我正在寻找一种方法将不同行的字符串聚合成一行.我想在很多不同的地方做这个,所以有一个功能来促进这将是很好的.我尝试使用COALESCE和的解决方案FOR XML,但他们只是不为我削减它.

字符串聚合会执行以下操作:

id | Name                    Result: id | Names
-- - ----                            -- - -----
1  | Matt                            1  | Matt, Rocks
1  | Rocks                           2  | Stylus
2  | Stylus
Run Code Online (Sandbox Code Playgroud)

我已经看过CLR定义的聚合函数作为替代COALESCEFOR XML,但显然SQL Azure 支持CLR定义的东西,这对我来说很痛苦因为我知道能够使用它会解决很多问题.我的问题.

是否有任何可能的解决方法,或类似的最佳方法(可能不如CLR那样最优,但嘿,我会采取我能得到的)我可以用来聚合我的东西?

sql sql-server aggregate-functions azure azure-sql-database

91
推荐指数
6
解决办法
13万
查看次数

使用async/await堆栈跟踪

很清楚为什么堆栈跟踪会受到微软新编程范式的影响.我们现在有一个语义堆栈和几个物理堆栈(我选择的单词).

我看到的是异常的StackTrace属性(在调试器中)是物理的属性,连接起来:

private async Task CheckFooAndBar()
{
    var log = LogManager.GetLogger("Test");
    log.Info("CheckFooAndBar");
    try
    {
        await Foo();
    }
    catch (Exception ex)
    {
        log.Info("StackTrace of last exception: " + ex.StackTrace);
    }
    Console.ReadKey();
}
private async Task Foo()
{
    await Task.Factory.StartNew(() => Thread.Sleep(1000));
    await Bar();
    await Task.Factory.StartNew(() => Thread.Sleep(1000));
}
private async Task Bar()
{
    await Task.Factory.StartNew(() => Thread.Sleep(1000));
    throw new Exception();
    await Task.Factory.StartNew(() => Thread.Sleep(1000));
}
Run Code Online (Sandbox Code Playgroud)

这给出了:

StackTrace of last exception:    at NLogAsyncExceptionTestCase.Program.<Bar>d__d.MoveNext() in c:\Users\Jens\Documents\Visual Studio 2012\Projects\NLogAsyncExceptionTestCase\NLogAsyncExceptionTestCase.Console\Program.cs:line 53
--- End …
Run Code Online (Sandbox Code Playgroud)

c# logging stack-trace visual-studio-debugging async-await

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

Azure Web Apps非常慢

我一直在调查我的生产应用程序的缓慢预热时间,我得到了一些意想不到的结果.

在各种Azure VM上进行测试表明,预热时间与应用程序服务器性能密切相关(因此它不是外部请求,包括sql),但真正有趣的是与Azure Web Apps和我自己的本地计算机的比较(所有时间都是从大约3次运行的平均值):

VM A0:            >1m
VM A2:            13s
VM D2V2:           6.8s
VM D5V2:           7.8s
Wep App P2:       25s
Web App S2:       26.5s
My local machine:  6.6s
Run Code Online (Sandbox Code Playgroud)

我的本地机器是一台3.3GHz的i5.

即使本地计算机通过Internet连接到同一SQL Azure数据库,该本地计算机也是最快的,并且该请求包括实体框架的模型检查.

所有测试都使用.NET 4.6.1,这是目前最新的版本.

明显的结论:

  • 对于不可并行化的作业,我4岁的桌面盒比任何大小的Azure VM都要快.
  • 即使您愿意每月花费500美元,Azure Web Apps也可以在土豆上运行.

这看起来很可疑.还有什么想法可能会发生什么?或者要测试什么?

在进行一些分析之后编辑:以下所有内容都没有解释我的问题,但它仍然是有趣的信息(在另一个A2 VM上测试,在连接分析器时总请求时间为20秒):

  • 58%是jitting.
  • 文件IO阻塞几乎为零(应用程序之前已经启动过,所以我猜所有必需的dll部分都在内存缓存中).
  • <1%是SQL Azure请求.
  • 因此,90%运行时间的其余部分应该是.NET执行或探查器开销.
  • 探查器本身有很大的开销,因为请求在没有它的情况下运行大约只有15秒(我使用了JetBrains dotTrace的试用版,我非常喜欢)
  • 50%的时间是在使用Entity Framework的第一次请求期间,其中80%是jitting
  • 15%是SignalR的第一次使用,几乎没有jitting(做一些反思 - 废话)

几乎没有并行化.

asp.net azure azure-web-sites azure-virtual-machine

31
推荐指数
2
解决办法
9449
查看次数

编译时使用的Bug?导致PEVerify失败的错误图像

我偶然发现了一些奇怪的事情:我BadImageFormatException不知道它可能会引用什么图像(汇编).

我减少了解决方案,使它只包含一个没有依赖项的项目:

在此输入图像描述

如您所见,它只使用System(和mscorlib),当然我不会在运行时加载程序集.

它编译为AnyCpu与.NET 4.5.2,VS 2015与C#6,虽然这些都不重要.

我尝试使用C#5制作样本,但是一旦我替换了所有的"?".运营商,它停止发生.

我主持了这个项目,以便人们可以自己尝试:

git clone -b crash-sample https://github.com/jtheisen/moldinium.git
Run Code Online (Sandbox Code Playgroud)

我在4台机器上进行了清洁和测试,所有这些都显示出相同的效果.

崩溃的堆栈跟踪是:

Ex.: System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
   at IronStone.Moldinium.LiveList.<>c__DisplayClass10_0`1.<Where>b__2(ListEvent`1 v)
   at IronStone.Moldinium.ActionObserver`1.OnNext(T value) in C:\Source\Repos\moldinium\ConsoleApplication1\Rx.cs:line 51
...snipped...
Run Code Online (Sandbox Code Playgroud)

在输出上运行PEVerify会产生以下错误:

[IL]:错误:[C:\ Source\Repos\moldinium\ConsoleApplication1\bin\Debug\Bad.exe:IronStone.Moldinium.LiveList + <> c__DisplayClass10_0`1 [TSource] :: b__2] [offset 0x0000013B]无法解析令牌.

?.从Select.cs文件中删除所有操作符可以解决该问题.

使用ILSpy我已将问题隔离到:

IronStone.Moldinium.LiveList.<>c__DisplayClass10_0`1.<Where>b__2
Run Code Online (Sandbox Code Playgroud)

您可以在主旨看(通过ILSpy)方法的IL转储这里.Bad IL是使用?.Good IL时的C#5.0风格.

这是用VS2015.3构建的

CSC版本:Microsoft(R)Visual C#编译器版本1.3.1.60616

c# roslyn c#-6.0 visual-studio-2015

16
推荐指数
1
解决办法
295
查看次数

NLog和最终规则

我经常想要将特定的聊天记录器中的日志记录排除到某个级别.不幸的是,以下第一条规则对于该记录器的所有级别都是最终的,因此第二条规则(这只是我的默认规则)不会记录任何内容:

<logger name="ChattyLogger" maxlevel="Warn" writeTo="blackhole" final="true" />

<logger name="*" minlevel="Info" writeTo="default" />
Run Code Online (Sandbox Code Playgroud)

一种可能性是使用过滤器:

<logger name="ChattyLogger" writeTo="blackhole">
  <filters>
    <when condition="level&lt;=LogLevel.Warn" action="IgnoreFinal" />
  </filters>
</logger>

<logger name="*" minlevel="Info" writeTo="default" />
Run Code Online (Sandbox Code Playgroud)

但是语法很难看,特别是长度和逃避条件表达式的需要.

由于这似乎是一个普遍的要求,我想知道我是否忽略了一些东西.

我在Silverlight下使用nlog,但我认为这无关紧要.

.net nlog

13
推荐指数
1
解决办法
4196
查看次数

VS2012 Xaml Designer:资源视图在哪里?

我很高兴看到VS2012的设计师比旧版更接近Blend.我仍然没有找到的一件事是Blend的"资源视图":

在此输入图像描述

VS2012有一些它称为资源视图,但这是不同的东西.

如果没有这个,除了通过点击使用它们的控件之外,无法访问模板.

designer visual-studio-2012

11
推荐指数
1
解决办法
828
查看次数

TypeScript:从任何东西到任何东西的隐式演员?

我只是在学习TypeScript而且我对它的性质感到有点困惑any.看看这个:

var x: any = 1;
var y = 1;
x = y;
y = x; // why does this not cause a compile-time error?
Run Code Online (Sandbox Code Playgroud)

起初我理解any为没有任何承诺的类型 - 这就是为什么第一项任务合理可行 - 但似乎在其他情境(第二项任务)中,它可以是一种具有所有可以想象的承诺的类型.

例如,这件疯狂也编译得很好:

undefined.foo
Run Code Online (Sandbox Code Playgroud)

那是因为undefined假设是any,这是一种承诺一切的类型.嗯.

对比这个

var a : HTMLElement = new HTMLDivElement();
var b = new HTMLDivElement();
a = b;
b = a; // doesn't compile. phew.
Run Code Online (Sandbox Code Playgroud)

在这里,我们得到了我希望通过强类型语言为更特殊的东西分配更通用的东西:错误,作为显式强制转换是必要的:

b = <HTMLDivElement>a; // ah, you mean it's really a div...
Run Code Online (Sandbox Code Playgroud)

在大多数使用的情况下any …

typescript

9
推荐指数
2
解决办法
3030
查看次数

简化相对网址

我想知道是否其他人可以根据System.Uri标准.NET框架中可用的方法或其他方法,提出一种简化相对URL的更好方法。我的尝试有效,但是非常可怕:

public static String SimplifyUrl(String url)
{
    var baseDummyUri = new Uri("http://example.com", UriKind.Absolute);
    var dummyUri = new Uri(baseDummyUri , String.Join("/",
        Enumerable.Range(0, url.Split(new[] { ".." }, StringSplitOptions.None).Length)
                  .Select(i => "x")));

    var absoluteResultUri = new Uri(dummyUri, url);
    var resultUri = dummyUri.MakeRelativeUri(absoluteResultUri);
    return resultUri.ToString();
}
Run Code Online (Sandbox Code Playgroud)

例如,这给出了:

./foo -> foo
foo/./bar -> foo/bar
foo/../bar -> bar
Run Code Online (Sandbox Code Playgroud)

使它如此尴尬的问题是,Uri它本身似乎并没有简化相对的URL,而且MakeRelativeUri仅适用于绝对URL。因此,为了诱使Uri类执行我想要的操作,我构造了具有适当数量的嵌套的基本URL。

我也可以使用System.IO.Path,但是随后我必须搜索并替换反斜杠来斜杠...

必须有更好的方法,对吗?

.net c#

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

.NETPlatform与.NETStandard

我现在对.NET中平台的术语感到困惑 - 我曾经理解它直到我们拥有PCL.

我找到了以下文件:

对于初学者来说,第一个文档是指概念平台,其名称为"netstandard",称为".NET平台标准".后者称之为".NET标准"(同时它引入了一个新的".NET标准库").

我真的不明白为什么第一个文档在顶部有一个免责声明,第二个文件描述了后继概念:似乎至少显示版本关联的表在第一个文档中是更新的.

那么".NET平台标准"和".NET标准库"这两个概念之间的区别是什么?描述新概念的第二个文档中的表只显示了基本上是旧表的内容,而没有为这个新的".NET标准库"添加新行 - 好像概念毕竟是相同的.免责声明真的只是建议重命名吗?

NuGet增添了更多神秘感:

Json.NET NuGet包有一个名为".NETStandard"的目标(显然NuGet使用其中一个东西的第三个名字)并且我认为这应该与"netstandard"相同,对吧?这实际上是".NET平台标准",对吗?

Microsoft.AspNet.Mvc包的RC 有一个名为".NETPlatform 5.4"的目标.那是什么?它的调用方式不同,并且版本太高而无法与.NET平台标准版或.NET标准库有任何关系,无论两者之间的关系如何.嗯.

有人知道所有这些真正意味着什么吗?

编辑:

我设法弄清楚了一点:正如Lex Li所说,rc版本Microsoft.AspNet.Mvc已经不复存在了.它使用了短名称"dotnet5.4",它在第一个文档中确实被引用为已弃用并且长期称为".NET平台".该软件包的当前最新版本可能是名为"Microsoft.AspNetCore.Mvc"的版本,它仅指非失效的目标名称.

这就解决了问题的NuGet部分,我的理论是,".NET标准库"只是对以前称为".NET平台标准"的重命名.这就留下了".NET平台"这个术语,我怀疑这个版本的版本计数没有重置为"1"时,这个版本的名称更为旧版.

也许知道这些事情的人可以确认或纠正这一点.

.net nuget .net-core asp.net-core

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

用于单线程异步 async-await 风格编程的信号量

信号量是一种多线程锁定机制,可确保只有有限数量的线程在给定资源上运行。互斥体是一种特殊情况,其中有限数量为 1。

异步编程与多线程编程有很多共同点(有时也有关系),尽管它本身并不是多线程的。

以下代码创建十个任务,只需等待一秒钟并记录其开始和结束。

所有这些都仅在一个线程上执行(我假设已经进行了适当的同步上下文维护,例如 WPF 中的情况)。

因此,即使只有一个线程,我们也有“并行”任务,并且在某些用例中,人们可能希望将对资源的访问限制为仅少数或其中一个任务。(例如,限制并行网络请求。)

看来需要一个“异步信号量”——这个概念不锁定线程,而是锁定异步延续。

我已经实现了这样一个信号量来检查它是否确实有意义并阐明我的意思。

我的问题是:这个东西是否已经可用,最好是在 .NET 框架本身中可用?我找不到任何东西,尽管在我看来它应该存在。

这是代码(LINQPad 在此分享):

    async void Main()
    {
        // Necessary in LINQPad to ensure a single thread.
        // Other environments such as WPF do this for you.
        SynchronizationContext.SetSynchronizationContext(
            new DispatcherSynchronizationContext());

        var tasks = Enumerable.Range(1, 10).Select(SampleWork).ToArray();

        await Task.WhenAll(tasks);

        "All done.".Dump();
    }

    AsyncSemaphore commonSemaphore = new AsyncSemaphore(4);

    async Task SampleWork(Int32 i)
    {
        using (await commonSemaphore.Acquire())
        {
            $"Beginning work #{i} {Thread.CurrentThread.ManagedThreadId}".Dump();

            await Task.Delay(TimeSpan.FromSeconds(1));

            $"Finished work #{i} {Thread.CurrentThread.ManagedThreadId}".Dump();
        }
    }

    public …
Run Code Online (Sandbox Code Playgroud)

.net asynchronous task-parallel-library async-await

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