通过Lambda将2个或多个变量传递给新任务(线程)是否安全
本文关键字:新任务 线程 安全 是否 2个 Lambda 变量 通过 | 更新日期: 2023-09-27 18:01:02
使用大量任务,有时我需要通过lambda向新线程传递2个或多个变量。我不确定是否使用lambda,这些变量总是作为线程ExecutionContext的一部分传递给另一个任务/线程。
Task<int> t = Task.Run(() => MyFunction(Var1, Var2, Var3), cts.Token);
你没有解释你所说的安全到底是什么意思,所以这个问题很模糊。
一般来说,传递这样的参数是安全的(尽管它与ExecutionContext
无关(。但有几件事你必须小心:
首先,与多线程一样,您必须小心同时从多个线程访问同一对象,并且最有可能使用锁定。
其次,应用lambda的正常规则:lambda中使用的变量形成闭包。这意味着对这些变量的任何更改也会反映在lambda中。
我个人对任务没有太多经验,但从我对任务的处理来看,这应该不是问题,因为当你调用函数并传递参数时,会创建对这些参数变量的引用,这样它们就不会被垃圾收集。只需注意不要使用外部作用域中的一些变量(请检查此答案(。
参数的数量并不那么重要。更重要的是如何在单独的线程中使用它们,并且像传递方法参数一样传递它们是可以的。如果你不知道如何传递更多的参数,请看这个答案。
Matthew Watson提到的关闭问题的场景看起来是这样的:
void Method(){
var someVar = GetSomeVar();
var t = Task.Run(() => {
// internal closure uses outer private variable
DoSomething(someVar);
});
someVar = somethingElse;
}
免责声明:这个答案可能是错误的,这个代码可能有效,但我认为你的代码不会有问题:(