比较多个回调的参数

时间:2016-10-03 16:52:29

标签: c# unity3d callback

我正在使用Unity Engine编写游戏,目前我遇到了以下问题:

我有一个使用回调函数的参数异步返回结果的方法。很简单,看起来像这样:

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函数是库的一部分,因此我无法对其进行更改。其他一切都是可变的。

3 个答案:

答案 0 :(得分:1)

您应该使用基于Task的模型,而不是使用基于回调的模型。让CalculateSomething返回Task<float>而不是回调。这允许您通过编写如下代码来使用TPL来组合这些Task对象:

var highestResult = (await Task.WhenAll(manyFloats.Select(CalculateSomething))).Max();

如果您无法编辑方法本身,请创建自己的包装器,将方法转换为基于任务的版本。

答案 1 :(得分:1)

这是合约。 你完全正确地创建了数组并存储了值,并在完成所有回调时对它们进行了比较。因此问题是您不知道何时返回所有回调。但是根据原始manyFloats变量的数量,您知道有多少回调。您需要做的就是保留一个计数器,并在每次返回回调时将其添加。并检查它是否等于manyFloats的数量,然后你可以进行比较:

int count = 0;
void myCallback(float f)
{
    ... usual stuff
    ... then
    if(count == manyFloats.Count) 
    {
        // do the comparison
    }
    else
    {
        count ++;
    } 
}

答案 2 :(得分:0)

因此,如果我们无法控制CalculateSomething函数,我们仍然可以存储最大值并在回调中进行比较。像这样:

void callbackFunction( float numb){
    if (numb > maxNumb) //maxNumb is global
        maxNumb = numb;
}

然后你可以使用你的foreach循环遍历你的数组。请记住,您需要声明maxValue全局变量并使其最初等于最小值。

即使您没有进行最小/最大比较,并且它更复杂,您仍然可以在回调函数中执行此操作。不需要数组,因为即使使用数组,如果你可以使用单个传递数组 - 你可以在回调函数中完成它。