0

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

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

2 回答 2

3

您没有解释安全的确切含义,所以这个问题很模棱两可。

一般来说,像这样传递参数是安全的(尽管它与 无关ExecutionContext)。但是有几件事情你必须要小心:

首先,与多线程一样,您必须小心同时从多个线程访问同一个对象,并且您很可能应该为此使用锁定。

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

于 2013-02-25T18:21:36.977 回答
1

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

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

Matthew Watson 提到的存在关闭问题的场景如下所示:

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

免责声明:这个答案可能是错误的,这个代码可能有效,但我认为你的代码不会有问题:)

于 2013-02-25T12:57:38.710 回答