使用大量的任务,有时我需要通过lambda将2个或更多变量传递给新线程。我不确定我是否使用lambda,这些变量总是作为Thread的ExecutionContext的一部分传递给另一个任务/线程。
Task<int> t = Task.Run(() => MyFunction(Var1, Var2, Var3), cts.Token);
答案 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;
}
免责声明:这个答案可能有误,这段代码可以正常工作,但我认为你的代码不会有问题:)