通过Lambda将2个或更多变量传递给新的任务(线程)是否安全?

时间:2013-02-25 10:57:01

标签: c# c#-5.0

使用大量的任务,有时我需要通过lambda将2个或更多变量传递给新线程。我不确定我是否使用lambda,这些变量总是作为Thread的ExecutionContext的一部分传递给另一个任务/线程。

Task<int> t = Task.Run(() => MyFunction(Var1, Var2, Var3), cts.Token);

2 个答案:

答案 0 :(得分:3)

你没有解释你到底是什么意思,所以这个问题很模糊。

通常,传递这样的参数是安全的(尽管它与ExecutionContext无关)。但是有几点你需要注意:

首先,与多线程一样,你必须要小心同时从多个线程访问同一个对象,你最有可能使用锁定。

其次,lambdas的正常规则适用:lambda中使用的变量形成一个闭包。这意味着对这些变量的任何更改也会反映在lambda中。

答案 1 :(得分:1)

我个人对任务没有太多经验,但是从我对它们所做的事情来看,这应该不是问题,因为当你调用函数并传递参数时,会创建对这些参数变量的引用,所以它们不会被垃圾收集。 请注意不要使用外部范围外的一些变量(check this answer)。

参数数量不是那么重要。更重要的是你如何在单独的线程中使用它们,并像方法参数一样传递它们是可以的。如果您不知道如何传递更多参数,请参阅this answer

Matthew Watson提到的关闭问题的场景看起来像这样:

void Method(){
    var someVar = GetSomeVar();
    var t = Task.Run(() => { 
        // internal closure uses outer private variable
        DoSomething(someVar);
    });
    someVar = somethingElse;
}

免责声明:这个答案可能有误,这段代码可以正常工作,但我认为你的代码不会有问题:)