相关疑难解决方法(0)

在C#中使用委托

在C#语言和.NET框架中,您能帮我理解委托吗?我试图检查一些代码,发现我收到的结果对我来说意外.这里是:

class Program
{
    public static int I = 0;

    static Func<string> del = new Func<string>(I.ToString);

    static void Main(string[] args)
    {
        I = 10;
        Console.WriteLine("{0}", del());
    }
}
Run Code Online (Sandbox Code Playgroud)

答案是0,但不是10.为什么?

.net c# delegates

79
推荐指数
1
解决办法
3061
查看次数

C# lambda 分配和收集

我今天看到了这个关于ConcurrentDictionary方法的一些性能差异的问题,我认为这是一个过早的微优化。

然而,经过一番思考,我意识到(如果我没记错的话),每次我们将 lambda 传递给一个方法时,CLR 都需要分配内存,传递适当的闭包(如果需要),然后过一段时间再收集它.

有以下三种可能:

  1. 没有闭包的 Lambda:

    // the lambda should internally compile to a static method, 
    // but will CLR instantiate a new ManagedDelegate wrapper or
    // something like that?
    return concurrent_dict.GetOrAdd(key, k => ValueFactory(k));
    
    Run Code Online (Sandbox Code Playgroud)
  2. 带闭包的 Lambda:

    // this is definitely an allocation
    return concurrent_dict.GetOrAdd(key, k => ValueFactory(k, stuff));
    
    Run Code Online (Sandbox Code Playgroud)
  3. 外部检查(例如检查锁定前的条件):

    // no lambdas in the hot path
    if (!concurrent_dict.TryGetValue(key, out value))
        return concurrent_dict.GetOrAdd(key, k => ValueFactory(k));
    
    Run Code Online (Sandbox Code Playgroud)

第三种情况显然不需要分配,第二种情况需要分配。

但是第一种情况(没有捕获的 lambda)是否完全不需要分配(至少在较新的 CLR 版本中)?另外,这是运行时的实现细节,还是标准指定的内容?

.net clr lambda garbage-collection micro-optimization

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

如何使用委托构造TransformManyBlock

我是C#TPL和DataFlow的新手,我正在努力研究如何实现TPL DataFlow TransformManyBlock.我正在将其他一些代码翻译成DataFlow.我的(简化)原始代码是这样的:

private IEnumerable<byte[]> ExtractFromByteStream(Byte[] byteStream)
{
    yield return byteStream; // Plus operations on the array
}
Run Code Online (Sandbox Code Playgroud)

在另一种方法中,我会这样称呼它:

foreach (byte[] myByteArray in ExtractFromByteStream(byteStream))
{
    // Do stuff with myByteArray
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建一个TransformManyBlock来生成来自较大输入数组(实际上是二进制流)的多个小数组(实际上是数据包),因此in和out都是类型byte[].

我尝试了下面的内容,但我知道我错了.我想使用与以前相同的函数构造这个块,并且只是将TransformManyBlock它包裹起来.我收到一个错误"这个电话很模糊......"

var streamTransformManyBlock = new TransformManyBlock<byte[], byte[]>(ExtractFromByteStream);
Run Code Online (Sandbox Code Playgroud)

.net c# dataflow task-parallel-library tpl-dataflow

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