我有两个后台工作者在无限循环中调用一个函数,但输入参数不同。该函数中使用了很多变量。
问题:定义函数内部使用的变量的最佳方法是什么?
如果我全局定义变量,性能很好。但是,我必须多次使用锁来确保修改变量时没有冲突。
如果我在函数内部定义变量,那么就不会发生冲突(显然),但代码会慢2-3倍。这是预期的,因为它就像在循环中定义变量而不是在循环外定义它们。
一种解决方案是制作该函数的另一个副本,并定义单独的全局变量,以用于该线程中调用的第二个线程和第二个函数。这在性能方面可能不错,但我认为这不是最优雅的方法。
任何意见/解决方案都表示赞赏。
答案 0 :(得分:1)
创建一个包含所有变量的Properties的类。让每个BackgroundWorker创建自己的此类实例,并将其作为Argument传递给函数。
虽然我不太清楚如果在函数本身中定义这些变量,为什么你的性能会降低2-3倍。
答案 1 :(得分:0)
每个后台工作人员的参数是否有效“恒定”?如果是这样,你可以创建一个返回函数的函数 - 它类似于你提出的解决方案,但更优雅,因为你实际上并不需要复制函数。这是一个简单的例子:
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);
};
}
然后每个后台工作者都会获得自己的函数副本,该函数是围绕它想要使用的参数构建的。
根据您正在创建的函数的参数的复杂程度,您可能需要创建一个“参数映射”类的类,以使代码更清晰。