多个后台工作线程使用不同的参数调用同一函数

本文关键字:参数 调用 函数 后台 工作 线程 | 更新日期: 2023-09-27 18:34:09

我有两个后台工作者,它们在无限的while循环中调用一个函数,但输入参数不同。该函数中使用了很多变量。

问题:定义函数内部使用的变量的最佳方法是什么?

如果我全局定义变量,性能会很棒。但是,我必须多次使用锁来确保修改变量时没有冲突。

如果我在函数内部本地定义变量,就不会有冲突(显然(,但代码会慢 2-3 倍。这是预期的,因为它就像在循环内定义变量而不是在循环外定义它们一样。

一种解决方案是创建该函数的另一个副本,并定义单独的全局变量以用于该线程中调用的第二个线程和第二个函数。就性能而言,这可能很好,但我相信这不是最优雅的方法。

任何意见/解决方案都值得赞赏。

多个后台工作线程使用不同的参数调用同一函数

创建一个包含所有变量属性的类。 让每个 BackgroundWorker 创建自己的此类实例,并将其作为参数传递给函数。

虽然我不太清楚为什么如果您在函数本身中定义这些变量,您的性能会降低 2-3 倍。

每个后台工作线程的参数是否有效"恒定"?如果是这样,你可以创建一个返回函数的函数 - 它类似于你想出的解决方案,但更优雅,因为你实际上不需要复制该函数。这里有一个简单的例子:

public void RunBackgroundWorkerOne()
{
    var myFunction = CreateFunction("Hello ", "World");
    while (true)
        myFunction();
}
public Func<string> CreateFunction(string value1, string value2)
{
    return (value1, value2) =>
    {
        return String.Format(value1, value2);
    };
}

然后,每个后台工作线程都会获得围绕要使用的参数构建的函数自己的副本。

根据要创建的函数的参数的复杂程度,您可能需要创建"参数映射"类型的类以使代码更清晰。