C#Tuple没有返回值

时间:2016-01-07 20:19:40

标签: c# asynchronous return tuples task

这是我第一次使用元组,所以我可能会做一些完全错误的事情,或者只是错过了一些小事。我以前有重复的代码:

            if (!B1Fturn)
            {
                if (B1turn)
                {
                    FixCall(b1Status, ref b1Call, ref b1Raise, 1);
                    FixCall(b1Status, ref b1Call, ref b1Raise, 2);
                    Rules(2, 3, "Bot 1", ref b1Type, ref b1Power, B1Fturn, b1Status);
                    AutoCloseMsb.Show("Bot 1 Turn", "Turns", thinkTime);
                    AI(2, 3, ref bot1Chips, ref B1turn, ref  B1Fturn, b1Status, b1Power, b1Type);
                    turnCount++;
                    B1turn = false;
                    B2turn = true;
                }
            }
            if (B1Fturn && !b1Folded)
            {
                bools.RemoveAt(1);
                bools.Insert(1, null);
                maxLeft--;
                b1Folded = true;
            }
            if (B1Fturn || !B1turn)
            {
                await CheckRaise(1, 1);
                B2turn = true;
            }

我复制并粘贴了5次,所以我决定把它全部放在一个方法中,然后将方法粘贴5次。所以我开始这样做,但我意识到我需要等待一些方法,所以我去了async Task<some input>但是我需要取回一些值,一些布尔值和int的.2选项返回或使用ref / out。无论如何都不允许在异步方法中使用Ref / out,因此只返回。事情是我需要返回一些不同类型的数据,所以我需要一些能做到这一点的东西(它是元组)。我使用Tuple创建了一个方法:

async Task<Tuple<bool, bool, bool>> Rotating(bool tempTurn, bool permaTurn, bool folded, string name, Label Status, int botCall, int botRaise, int start, int end, int current, bool next, double power, double type, int chips)
    {
        if (!permaTurn)
        {
            if (tempTurn)
            {
                FixCall(Status, ref botCall, ref botRaise, current);
                FixCall(Status, ref botCall, ref botRaise, start);
                Rules(start, end, name, ref type, ref power, permaTurn,Status);
                AutoCloseMsb.Show(name + " Turn", "Turns", thinkTime);
                AI(start, end, ref chips, ref tempTurn, ref  permaTurn, Status, power, type);
                turnCount++;
                tempTurn = false;
                next = true;
            }
        }
        if (permaTurn && !folded)
        {
            bools.RemoveAt(current);
            bools.Insert(current, null);
            maxLeft--;
            folded = true;
        }
        if (permaTurn || !tempTurn)
        {
            await CheckRaise(current, current);
            next = true;
        }
        return new Tuple<bool, bool, bool>(tempTurn, permaTurn, next);
    }

正如你所看到的那样,它表示返回bool,bool,bool以及之后需要获得的值。然而,如果我把断点放在return线上从下一个转向为真,那么接下来没有得到它的价值会改变,但是一旦它退出该方法,它就会恢复为默认值。其他2个布尔也是如此。为什么?我怎么做错了如何解决这个问题。

  • P.S我还需要像前面提到的那样返回几个int,但是为了简单起见我删除了它们。

1 个答案:

答案 0 :(得分:3)

聊天后的对话编辑: 你可以等待async函数,它将返回一个元组,使用它如下:

var r = await Test (x, y); // x,y for example, Test returns Tuple
Now you can access r.Item1 and r.Item2