Как ждать всех ответов метода WCF?

1

У меня есть метод WCF, который принимает множество игроков (клиентов) и добавляет их в список их для сортировки.

но, к сожалению, когда первый балл отправляется на сервер, функция добавляет его в список и отправляет отсортированный список клиенту, доза не дожидается всех других баллов от других Игроков. я попытался использовать async & wait, чтобы задержать продолжение метода в течение примерно 30 секунд следующим образом:

 public  List<Player>  GetListOfWinners(int SentScore , string _SentPlayerID )
    {
        List<Player> PlayersList = new List<Player>();
        //Add to the List 
        PlayersList.Add(new Player { PlayerID = _SentPlayerID, Score = SentScore });

        DelayMethod();
        //Order It
        List<Player> SortedList = PlayersList.OrderByDescending(p => p.Score).ToList(); 
        // sent fULL SORTHEDlist to the Clients
        return SortedList;

    }

    private async void DelayMethod()
    {
        await Task.Delay(30000);
    }

но он не работает, так что я должен делать?

  • 0
    Этот метод вызывается одновременно для каждого игрока? Я вижу только одного игрока отправляется
  • 0
    да, в начале игра Судоку отправляется всем игрокам, после определенного периода времени клиентская сторона для каждого игрока рассчитывает счет и отправляет его на сервер для этого метода (GetListOfWinners)
Показать ещё 7 комментариев
Теги:
multithreading
wcf

1 ответ

0

Я создал очень простой сервис в качестве образца, чтобы показать, как вы можете выполнить некоторые из своих целей. Он предоставляется как средство для ознакомления с конструкциями, такими как lock и ManualResetEvent.

В моем ISudokuConcurrentService.cs:

namespace SudokuTest
{
    using System.Collections.Generic;
    using System.Runtime.Serialization;
    using System.ServiceModel;

    [ServiceContract]
    public interface ISudokuConcurrentService
    {
        [OperationContract]
        SudokuGame ClientConnect();

        [OperationContract]
        List<Player> GetListOfWinners(int SentScore, string _SentPlayerID);
    }

    [DataContract]
    public class SudokuGame
    {
        [DataMember]
        public string PlayerID { get; set; }
        [DataMember]
        public int TimeLimitInSeconds { get; set; }
    }

    [DataContract]
    public class Player
    {
        [DataMember]
        public string PlayerID { get; set; }
        [DataMember]
        public int Score { get; set; }
    }
}

В моем SudokuConcurrentService.svc.cs:

namespace SudokuTest
{
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading;

    public class SudokuConcurrentService : ISudokuConcurrentService
    {
        static int playerCount = 0;
        static List<Player> PlayersList = null;
        static object ListLock = new object();
        const int TimeLimit = 120;
        static ManualResetEvent AllPlayerResponseWait = new ManualResetEvent(false);

        public SudokuGame ClientConnect()
        {
            lock (ListLock)
            {
                if (PlayersList != null)
                {
                    // Already received a completed game response -- no new players.
                    return null;
                }
            }
            return new SudokuGame()
                {
                    PlayerID = "Player " + Interlocked.Increment(ref playerCount).ToString(),
                    TimeLimitInSeconds = TimeLimit
                };
        }

        public List<Player> GetListOfWinners(int SentScore, string _SentPlayerID)
        {
            lock (ListLock)
            {
                // Initialize the list.
                if (PlayersList == null) PlayersList = new List<Player>();

                //Add to the List 
                PlayersList.Add(new Player { PlayerID = _SentPlayerID, Score = SentScore });
            }

            // Now decrement through the list of players to await all responses.
            if (Interlocked.Decrement(ref playerCount) == 0)
            {
                // All responses received, unlock the wait.
                AllPlayerResponseWait.Set();
            }

            // Wait on all responses, as necessary, up to 150% the timeout (no new players allowed one responses received, 
            // so the 150% should allow time for the last player to receive game and send response, but if any players have 
            // disconnected, we don't want to wait indefinitely).
            AllPlayerResponseWait.WaitOne(TimeLimit * 1500);

            //Order It
            List<Player> SortedList = PlayersList.OrderByDescending(p => p.Score).ToList();
            // sent fULL SORTHEDlist to the Clients
            return SortedList;

        }
    }
}

Обратите внимание, что основным ограничением этого образца является то, что он позволяет воспроизводить только одну игру в течение всего срока службы. Я оставлю несколько игр в качестве упражнения для вас, но укажу, что вам нужно будет отслеживать все, что делается сейчас за каждую игру. Вероятно, вам захочется собрать список и заблокировать блокировку объектов, которые затем можно сохранить в другом списке, например, в MemoryCache

Ещё вопросы

Сообщество Overcoder
Наверх
Меню