Task.Delay создает исключение System.ObjectDisposedException: «Невозможно получить доступ к удаленному объекту» с группой SignalR - PullRequest
0 голосов
/ 13 июля 2020

Я пишу код с ядром asp. net и Signalr, где есть метод:

public async void newGameTimer(int tableID )
        {
            bool stop = true;
            int val = 0;
            while (stop)
            {
                await Task.Delay(1000);
                val++;
                if (val > 5)
                {
                    stop = false;
                    newGame(tableID);
                }
            }
        }

Затем в методе newGame (tableID), который выглядит следующим образом:

public async void newGame(int tableID)
{
    await Clients.Group(group).SendAsync("updateTotalPot", 200);
}

Я отправляю асинхронный ответ группе игроков через signalR Group. но выдает ошибку

'System.ObjectDisposedException:' Невозможно получить доступ к удаленному объекту. ObjectDisposed_ObjectName_Name '

Я выполнил поиск и получил ответ, что «Task.Dealy ()» может создать ошибку ObjectDisposed. Теперь не могу понять, как решить проблему.

Я просто хочу подождать какое-то время, а затем отправить ответ группе игроков .. Кто-нибудь может мне помочь?

Project : Онлайн-игра в покер в реальном времени Онлайн-игра в покер, в которой группа друзей может создать стол и играть в покер вместе. Frontend: React Backend: asn. net core, Signalr, Redis

Logi c: Первый игрок создает таблицу, вызывая метод:

public async Task LoginWindow(string name, string password, int newTable, int joinTable)
{ 
   //- this method saves many keys in Redis in-memory like this
    dbr.StringSet("table" + "ToBet", 0);

  //- at end send reply with following command
     await Clients.Caller.SendAsync("updateMessage",  "Welcome to table no " + tableID);

//- then this method check, if second player has called this method, then calls the timer to start game after 5 seconds

  newGameTimer(tableID);
 
}


nothing else...

1 Ответ

1 голос
/ 13 июля 2020

Здесь async void не нужно. Решение может выглядеть так.

public async Task NewGameWithDelay(int tableID)
{
    for (int i = 0; i < 5; i++)
    {
        if (await CheckForSecondPlayer())
        {
            // found
            await Clients.Group(group).SendAsync("updateTotalPot", 200);
            return;
        }
        await Task.Delay(1000);
    }
    // not found
}

private async Task<bool> CheckForSecondPlayer()
{
    // if found return true, else
    return false;
}
public async Task LoginWindow(string name, string password, int newTable, int joinTable)
{ 
    dbr.StringSet("table" + "ToBet", 0);
    await Clients.Caller.SendAsync("updateMessage",  "Welcome to table no " + tableID);
    await NewGameWithDelay(tableID);
}
...