使用大量任务,有时我需要通过 lambda 将 2 个或更多变量传递给新线程。我不确定我是否使用 lambda,这些变量总是作为 Thread 的 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;
}
免责声明:这个答案可能是错误的,这个代码可能有效,但我认为你的代码不会有问题:)