小编Pav*_*syn的帖子

.NET Core 2.1 - 循环中的正则表达式200x比2.0慢(简单基准中为3x)

我有以下正则表达式:

    var regex = new Regex(
        @"^ActiveMQ[\d\.-]*$",
        RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
Run Code Online (Sandbox Code Playgroud)

它运行超过1000个字符串(IsMatch调用).在.NET Core 2.0中它需要10ms.迁移到.NET Core 2.1后,它将接管2 seconds相同的数据.

知道发生了什么事吗?2.1中的任何行为都有变化?

======================

更新:BenchmarkDotNet

可重复3次降(只运行,改netcoreapp2.1netcoreapp2.0csproj文件中,再次运行). https://github.com/ptupitsyn/netcore2.1-regex-perf/tree/master/src

  • 尽可能简化实际应用程序可以减少掉落,但仍然非常明显.
  • 翻转嵌套循环会将GetPackageInfos2perf降低仅降低25%,但它仍然存在.在真实世界的代码中更改它并非易事,我想避免这种重构.
  • 在循环中执行了多个RegEx,并且我无法仅使用一个RegEx重现丢弃

更新2

删除RegexOptions.Compiled解决了问题!

c# regex .net-core

17
推荐指数
1
解决办法
1068
查看次数

在Linux上的lldb中打开.NET Core 2.0转储 - 哪个版本是lldb?

我正在尝试按照http://blogs.microsoft.co.il/sasha/2017/02/26/analyzing-a-net-core-core-dump的说明在Ubuntu 16.04上打开.NET Core 2.0转储-on-Linux的/

转储是从运行进程创建的createdump PID.

我无法确定lldb的正确版本. ldd $(find /usr/share/dotnet -name libsosplugin.so) | grep lldb不返回任何内容(输出中没有lldb).

我尝试过最新的3.5和3.6,但无济于事: Can not load or initialize libmscordaccore.so. The target runtime may not be initialized.

如何为.NET Core 2.0转储找到正确的lldb版本?


更新:带输出的命令

$ find /usr/share/dotnet -name libsosplugin.so /usr/share/dotnet/shared/Microsoft.NETCore.App/2.0.5/libsosplugin.so

$ ldd $(find /usr/share/dotnet -name libsosplugin.so) linux-vdso.so.1 => (0x00007ffca344f000) libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f3d7eecc000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f3d7ebc3000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f3d7e9ad000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3d7e5e3000)

linux ubuntu lldb .net-core

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

使用x:Static指定时,将忽略DataTemplate键

我遇到了DataTemplate键的奇怪行为:当通过x:Type指定DataType时,x:通过x指定Key:静态引用,x:忽略Key.我写了示例应用来说明它.

XAML资源:

<DataTemplate DataType="{x:Type wpfApplication1:TestDto}" x:Key="{x:Static wpfApplication1:DataKeys.TestDtoKey}" />
<DataTemplate x:Key="{x:Static wpfApplication1:DataKeys.TestDtoKey2}" />
<DataTemplate DataType="{x:Type wpfApplication1:TestDto}" x:Key="TestKey3" />
<DataTemplate DataType="wpfApplication1:TestDto" x:Key="{x:Static wpfApplication1:DataKeys.TestDtoKey4}" />
Run Code Online (Sandbox Code Playgroud)

C#:

public class TestDto {}

public static class DataKeys
{
    public static string TestDtoKey = "TestKey";
    public static string TestDtoKey2 = "TestKey2";
    public static string TestDtoKey4 = "TestKey4";
}
Run Code Online (Sandbox Code Playgroud)

启动应用程序,请参阅this.Resources.Keys在调试器中:

{DataTemplateKey(WpfApplication1.TestDto)}  object {System.Windows.DataTemplateKey}
"TestKey2"  object {string}
"TestKey3"  object {string}
"TestKey4"  object {string}
Run Code Online (Sandbox Code Playgroud)

如您所见,在第一种情况下x:Key被忽略!

有人可以解释发生了什么吗?文档(http://msdn.microsoft.com/en-us/library/system.windows.datatemplate.datatype.aspx)明确指出,设置x:Key会将资源键设置为您在其中指定的任何内容.

c# wpf xaml

12
推荐指数
1
解决办法
1242
查看次数

覆盖仅覆盖父div

我在div中有一组控件(列表框和下面的按钮),我想用半透明覆盖(用中心的加载指示器)覆盖它们.

父div大小和位置不固定.

这是一个例子:http://jsfiddle.net/n4fbp8ex/ - 感兴趣的区域在红色边框内.我希望它覆盖有覆盖层. - "正在加载..."div是我的叠加层.它应该覆盖整个父div(但没有别的),文本应该垂直和水平居中

如何修复"centeredOverlay"风格?

HTML:

<div class="halfColumn">
    some content
    <br/>
    <input />
</div>
<div class="halfColumn">
    bla bla
    <br/>
    lorem ipsum
    <div style="border-style:solid; border-width: 1px; border-color: red;">
        <div class="centeredOverlay">Loading...</div>
        <select size=2 style="width:100%; height:50vh">
        </select>
        <button>Click me</button>
        <button>Click me too</button>

    </div>
</div>
<div style="clear:both"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

CSS:

.centeredOverlay {
  position: absolute;
  background-color: rgba(0,0,0,0.3); /*dim the background*/
}

.halfColumn {
    float: left;
    width: 50%;
}

.halfColumn2 {
    float: right;
    width: 50%;
}
Run Code Online (Sandbox Code Playgroud)

html css

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

从RIA服务加载数据时Silverlight中的偶发Arg_COMException

用户在处理应用程序时有时会遇到奇怪的异常 我无法复制它.它在执行一个特定的域服务查询时发生.此查询经常执行(每次用户保存更改时).

查询没有参数.有简单的过滤:Context.GetEventsQuery().其中​​(lce => lce.Id> maxId)

域服务方法很简单:public IQueryable GetEvents(){return ObjectContext.Events; }

在第一次发生之后,它每次都会发生(直到用户刷新网页).

以下是日志中的异常文本:查询"GetEvents"的加载操作失败.System.ServiceModel.DomainServices.Client.DomainOperationException:查询'GetEvents'的加载操作失败.---> System.Exception ---> System.Exception:[Arg_COMException]参​​数:调试资源字符串不可用.通常,密钥和参数提供了足够的信息来诊断问题. 在System.Net.Browser.BrowserHttpWebRequest上的System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)中查看http://go.microsoft.com/fwlink/?linkid=106663&Version=4.0.50917.0&File=mscorlib.dll&Key=Arg_COMException System.Net.Browser.AsyncHelper.<> c__DisplayClass5.b__4(Object sendState).<> c__DisplayClass2.b__0(Object sendState)---内部异常堆栈跟踪结束---在System.ServiceModel.DomainServices.Client.WebDomainClient在System.ServiceModel.DomainServices.Client.DomainContext.CompleteLoad(IAsyncResult asyncResult)的System.ServiceModel.DomainServices.Client.DomainClient.EndQuery(IAsyncResult asyncResult)的`1.EndQueryCore(IAsyncResult asyncResult)---内部异常堆栈跟踪结束 - - System.ServiceModel.DomainServices.Client.OmplerationBase.Complete(异常错误),位于System.ServiceModel.DomainServices.Client.DomainContext.CompleteLoad(IAsyncResult as)的System.ServiceModel.DomainServices.Client.LoadOperation.Complete(异常错误)yncResult)在System.ServiceModel.DomainServices.Client.DomainContext.<> c__DisplayClass1b.b__17(Object)

可能是什么原因?

silverlight service ria exception

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

从Visual C++中的内联汇编访问类成员

这是我的代码:

void Graph::PutPixel(DWORD x, DWORD y, DWORD c)
{
    __asm 
    {
        Mov Eax, y
        Mov Ebx, _width
        Mul Ebx
        Add Eax, x
        Shl Eax, 2 // Multiply by four
        Add Eax, _buffer
        Mov Edi, Eax
        Mov Eax, c
        StosD
    }
}
Run Code Online (Sandbox Code Playgroud)

_buffer和_width是Graph类成员:

private:
    DWORD _width;
    DWORD* _buffer;
Run Code Online (Sandbox Code Playgroud)

这是行不通的; 我从两个变量得到0值,但实际上它们还有其他一些值.

我可以通过将类变量复制到局部变量并使用它们来解决它:

void Graph::PutPixel(DWORD x, DWORD y, DWORD c)
{
    DWORD bufAddr = (DWORD)_buffer;
    DWORD w = _width;
    __asm 
    {
        Mov Eax, y
        Mov Ebx, w
        Mul Ebx
        Add Eax, x
        Shl …
Run Code Online (Sandbox Code Playgroud)

c++ assembly inline-assembly

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

BitmapImage OutOfMemoryException仅在Windows 8.1中

我最近安装了Windows 8.1来尝试,我的宠物项目正在崩溃(同样的二进制文件在一台Win7和两台Win8机器上工作正常).

在BitmapImage.EndInit中抛出OutOfMemoryException:

    public static BitmapImage GetResourceImage(string resourcePath, int decodePixelWidth = 0, int decodePixelHeight = 0)
    {
        var image = new BitmapImage();

        var moduleName = Assembly.GetExecutingAssembly().GetName().Name;
        var resourceLocation = string.Format("pack://application:,,,/{0};component/Resources/{1}", moduleName, resourcePath);

        image.BeginInit();
        image.UriSource = new Uri(resourceLocation);
        image.DecodePixelWidth = decodePixelWidth;
        image.DecodePixelHeight = decodePixelHeight;
        image.EndInit();
        image.Freeze();

        return image;
    }
Run Code Online (Sandbox Code Playgroud)
  • 崩溃过程的任务管理器读数:27MB内存,302个句柄,12个线程,36个用户对象,34个GDI对象,5.3 GB RAM可用
  • 平台目标是x86(由于本机DLL使用而需要)
  • 对于不同的(随机)图像,方法被多次调用(资源中有大约250个bmp文件)
  • decodePixelWidth/Height是随机的,但在有效范围内
  • 异常发生在不同的资源路径和大小上
  • 仅当DecodePixelWidth或DecodePixelHeight不为0时才会发生异常
  • 如果我注释掉DecodePixelWidth和DecodePixelHeight setter并让它加载到原始大小,则不会发生异常

据我通过谷歌搜索了解,它与GDI内部有关,但我找不到修复或解决方法.任何想法(除了使用一些其他机制来解码和/或调整图像大小 - 我只需要原始像素数据)?

可在此处找到完整的项目源代码(链接指向相关文件):https://code.google.com/p/lander-net/source/browse/trunk/csharp/LanderNet/Util/BitmapUtils.cs

更新: 我尝试使用TransformedBitmap进行大小调整,它失败并出现相同的异常.

c# out-of-memory bitmapimage windows-8.1

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

代表们不会收集垃圾

下面是一个演示此问题的控制台应用程序:

class Program
{
    static void Main()
    {
        InitRefs();
        GC.Collect();
        GC.WaitForPendingFinalizers();
        Console.WriteLine(_refObj.IsAlive);
        Console.WriteLine(_refAction.IsAlive);
        Console.WriteLine(_refEvent.IsAlive);
        Console.ReadKey();
    }

    private static void InitRefs()
    {
        _refObj = new WeakReference(new object());
        _refAction = new WeakReference((Action) (() => { }));
        _refEvent = new WeakReference(new EventHandler((sender, eventArgs) => { }));
    }

    private static WeakReference _refObj;
    private static WeakReference _refAction;
    private static WeakReference _refEvent;
}
Run Code Online (Sandbox Code Playgroud)

输出为"False True True".

我已经使用SOS.dll试图找到使代表们保持GCed的内容,这是我获得的Action:

!gcroot 02472584
HandleTable:
    006613ec (pinned handle)
    -> 03473390 System.Object[]
    -> 02472584 System.Action
Run Code Online (Sandbox Code Playgroud)

有人可以解释发生了什么吗?

c# garbage-collection

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

RequestSizeLimitAttribute: HTTP 500 而不是 ASP.NET Core 2.1.401 中的 413

我有[RequestSizeLimit]我的 API 控制器,它有点像预期的那样工作:大于指定限制的请求被拒绝。

    [HttpPut]
    [RequestSizeLimit(120_000_000)]
    public async Task<IActionResult> Put(IFormCollection form)
    {
       ...
    }
Run Code Online (Sandbox Code Playgroud)

问题是,抛出异常:

Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Request body too large.
   at Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException.Throw(RequestRejectionReason reason)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1MessageBody.ForContentLength.OnReadStarting()
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.MessageBody.TryInit()
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.MessageBody.ReadAsync(Memory`1 buffer, CancellationToken cancellationToken)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpRequestStream.ReadAsyncInternal(Memory`1 buffer, CancellationToken cancellationToken)
Run Code Online (Sandbox Code Playgroud)

因此返回 HTTP 500,但我希望返回 413 或 400。而且我不希望出现异常,因为这是完全正常的情况。

找不到关于此的任何文档。对于过大的请求,返回 413 的正确方法是什么?

c# asp.net-core

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

不要在LINQPad中重用查询过程

我打开了"在其自己的进程中运行每个查询"选项(默认值),但似乎在查询运行之间重用该进程(LINQPad.UserQuery.exe保持运行).

有没有办法避免这种重用?我每次都需要一个新进程(由于JVM的使用).

显而易见的是

Environment.Exit(0);
Run Code Online (Sandbox Code Playgroud)

但它会导致令人不快的"查询意外结束"消息.

linqpad

4
推荐指数
2
解决办法
427
查看次数

有没有办法为我在 ignitecache 中插入的不同元素设置不同的到期时间?

我可以像在 ehcache 中那样插入具有不同到期时间的元素吗

例如 :

缓存 : add element1 //5 秒后过期

cache : add element2 //15秒后过期

cache : add element3 //在'x'秒/分钟后过期

如果没有,你能建议任何替代缓存来解决这个问题吗?

我也打算使用 ehcache,但结果证明它不支持 active/eager 过期。

java caching ehcache guava ignite

0
推荐指数
1
解决办法
46
查看次数