代码之家  ›  专栏  ›  技术社区  ›  Patrick angularsen

使用匿名委托在同一上下文中启动线程的缺点

c#
  •  2
  • Patrick angularsen  · 技术社区  · 14 年前

    int myInt;
    new Thread(delegate() {
        // yeah, I'm in a separate thread! And I can access myInt as well, awesome
    }).Start();
    

    并且该范围内的所有局部变量也可以在该线程中使用。在我需要“在一旁”执行小计算而不是创建小方法并将它们作为线程启动的时候,我就使用了这个方法,所以我觉得它非常有用,即使它并不总是那么有用。

    最近我也遇到了需要打破 线程需要调用方法中的5个变量,考虑到两个作用域都需要引用局部变量,这让我怀疑这是否是“良好的编码”。

    因此,我想知道是否最好创建一个新类(在 SpecificContext )并使用 ParameterizedThreadStart

    2 回复  |  直到 14 年前
        1
  •  1
  •   jyoung    14 年前

    由于委托使用myInt,编译器创建了一个隐藏类,将myInt从普通堆栈变量转换为堆变量的引用。实际上,它为您创建了一个start参数对象。因为编译器为您做了所有正确的事情,所以我将使用最可读的代码。在这种情况下,我怀疑它会直接使用myInt。

        2
  •  1
  •   ika    14 年前

    当您有一个匿名方法时,C编译器会为您生成一个类。该类包含委托内引用的所有局部变量,并且不同步。