小编Mac*_*ski的帖子

为什么总结一个值类型数组然后总结一个引用类型数组?

我想更好地了解内存如何在.NET中运行,所以我正在使用BenchmarkDotNet和诊断器.我通过对数组项进行求和来创建基准比较classstruct性能.我期望求和值类型总是更快.但对于短阵列则不然.有谁能解释一下?

代码:

internal class ReferenceType
{
    public int Value;
}

internal struct ValueType
{
    public int Value;
}

internal struct ExtendedValueType
{
    public int Value;
    private double _otherData; // this field is here just to make the object bigger
}
Run Code Online (Sandbox Code Playgroud)

我有三个数组:

    private ReferenceType[] _referenceTypeData;
    private ValueType[] _valueTypeData;
    private ExtendedValueType[] _extendedValueTypeData;
Run Code Online (Sandbox Code Playgroud)

我使用相同的随机值初始化.

然后是一个基准测试方法:

    [Benchmark]
    public int ReferenceTypeSum()
    {
        var sum = 0;

        for (var i = 0; i < Size; i++)
        {
            sum += _referenceTypeData[i].Value; …
Run Code Online (Sandbox Code Playgroud)

c# performance memory-management microbenchmark

24
推荐指数
3
解决办法
838
查看次数

WPF Dispatcher.InvokeAsync()与异步委托的奇怪行为

如果您有异步方法,如下所示:

    private async Task DoAsync()
    {
        Console.WriteLine(@"(1.1)");
        Thread.Sleep(200);
        Console.WriteLine(@"(1.2)");
        await Task.Delay(1000);
        Console.WriteLine(@"(1.3)");
    }
Run Code Online (Sandbox Code Playgroud)

并使用Dispatcher异步调用它:

        Console.WriteLine(@"(1)");
        await Application.Current.Dispatcher.InvokeAsync(DoAsync);
        Console.WriteLine(@"(2)");
Run Code Online (Sandbox Code Playgroud)

你得到的输出将是:(1)(1.1)(1.2)(2)(1.3)

如果你使用Dispatcher.BeginInvoke()并且你将等待Completed事件,效果将是相同的(这是预期的):

        Console.WriteLine(@"(1)");
        var dispatcherOp = Dispatcher.BeginInvoke(new Func<Task>(DoAsync));
        dispatcherOp.Completed += (s, args) =>
        {               
        Console.WriteLine(@"(2)");
        };
Run Code Online (Sandbox Code Playgroud)

我们在这里看到的是DoAsync()方法中的await使得Dispatcher相信操作已经结束.

我的问题:这是一个错误还是一个功能?你知道任何描述这种行为的文件吗?我找不到任何东西.

我不是要求解决方法.

c# wpf dispatcher async-await

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