比较多个回调函数的参数

本文关键字:参数 函数 回调 比较 | 更新日期: 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全局变量,并使其初始值等于最小值。

即使你不做最小/最大比较,而且它是更复杂的东西,你仍然可以在回调函数中做。不需要数组,因为即使是数组,如果你可以用单遍数组来完成,你也可以在回调函数中完成。