比较多个回调函数的参数
本文关键字:参数 函数 回调 比较 | 更新日期: 2023-09-27 18:11:23
我正在使用Unity引擎编程一款游戏,我目前遇到以下问题:
我有一个方法,它使用回调函数的参数异步返回结果。非常简单,看起来像这样:
public void CalculateSomething( - PARAMETERS - , Action<float> callback)
对于不同的参数,我必须在一个循环中调用这个方法。
foreach(float f in manyFloats){
CalculateSomething(f, myCallback);
}
void myCallback(float f){
...compare this result value to the other values?...
}
现在我想比较不同回调带来的浮点数。假设我想找出这些浮点数中的最大值。我怎么做呢?
我有一个想法,将结果存储在一个数组字段,只是比较后,它是完全填充,但我不知道如何检查是否所有的回调已经完成。
理想情况下,我希望避免用这样的字段污染我的类,但如果没有其他方法也没关系。
CalculateSomething
函数是库的一部分,所以我不能改变它。
事情是这样的。你正确地创建了数组并存储了值,并在所有回调完成后对它们进行了比较。因此,问题是您不知道何时返回所有回调。但是你知道有多少回调基于你的原始manyFloats
变量的计数。您所需要做的就是保持一个计数器,并在每次返回回调时将其相加。然后检查它是否等于manyFloats的计数然后你可以进行比较:
int count = 0;
void myCallback(float f)
{
... usual stuff
... then
if(count == manyFloats.Count)
{
// do the comparison
}
else
{
count ++;
}
}
与其使用基于回调的模型,不如使用基于Task
的模型。让CalculateSomething
返回Task<float>
而不是回调。这允许您使用TPL编写以下代码来组合这些Task
对象:
var highestResult = (await Task.WhenAll(manyFloats.Select(CalculateSomething))).Max();
如果不能编辑方法本身,则创建自己的包装器,将方法转换为基于任务的版本。
所以,如果我们无法控制calculatessomething函数,我们仍然可以存储最大值并在回调中进行比较。像这样:
void callbackFunction( float numb){
if (numb > maxNumb) //maxNumb is global
maxNumb = numb;
}
则可以使用foreach循环遍历数组。请记住,您需要声明maxValue全局变量,并使其初始值等于最小值。
即使你不做最小/最大比较,而且它是更复杂的东西,你仍然可以在回调函数中做。不需要数组,因为即使是数组,如果你可以用单遍数组来完成,你也可以在回调函数中完成。