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