Tail-recursive call vs looping for a Poker app
GC.KeepAlive(Updates);



Do you really need to do this? Objects are not collected as long there is a valid reference to them meaning that Updates should always be avaiable if you are not replacing the reference. If you are replacing the reference it means that you are not keeping you object alive long enough for the current game which sounds leaky.


Bot1 = (Bot)RotateTurns(Bot1, Bot1.EnumCasted);



RotateTurns should be an instance method on Bot and should not be present on the current scope. And once again you are replacing the object reference. 
The bots should be alive at least as long as a game instance.

It would be better to keep a list of all bots so you could iterate on them.

foreach(var bot in _bots){
    await bot.RotateTurns();
}



if (!_restart)
{
    continue;
}
break;



The !_restart condition could be placed on the while. Also consider to keep this a method variable instead of a field.

while(!_restart)