Используйте асинхронные вызовы и выполняйте их параллельно.
Интернет очень быстрый. На самом деле, вы отправляете запрос, ожидаете вечность, пока (1) сообщение не поступит на сервер, (2) сервер не ответит, (3) ответ, чтобы вернуться обратно (1) и (3) занять время; возможно, в игре есть такие вещи, как «мили до сервера» и «скорость света». А затем вы отправляете следующий запрос и снова делаете ту же игру ожидания. И опять. В цикле.
Следовательно, асинхронные вызовы и параллельные запросы = победа.
(Подсказка: если вы используете F #, асинхронизация может быть очень простой, как в примере ниже.)
open System
open System.Diagnostics
open System.ServiceModel
let binding = new BasicHttpBinding()
let address = "http://YOURSERVERMACHINENAME:11111/Blah"
#if SERVER
[<ServiceContract>]
type IMyContract =
[<OperationContract>]
abstract member Subtract : x:int * y:int -> int
type MyService() =
interface IMyContract with
member this.Subtract(x,y) = x-y
let host = new ServiceHost(typeof<MyService>, new Uri(address))
host.AddServiceEndpoint(typeof<IMyContract>, binding, address) |> ignore
let smb = new Description.ServiceMetadataBehavior()
smb.HttpGetEnabled <- true
host.Description.Behaviors.Add(smb)
host.Open()
Console.WriteLine("service is open")
#else
[<ServiceContract(Name="IMyContract")>]
type IMyClientContract =
[<OperationContract>]
abstract member Subtract : x:int * y:int -> int
[<OperationContract(AsyncPattern=true)>]
abstract member BeginSubtract : x:int * y:int * c:AsyncCallback * o:obj -> IAsyncResult
abstract member EndSubtract : r:IAsyncResult -> int
let client = ChannelFactory<IMyClientContract>.CreateChannel(binding, new EndpointAddress(address))
let MAX = 30
let syncSw = Stopwatch.StartNew()
[1..MAX] |> Seq.iter (fun i ->
let r = client.Subtract(i,1)
Console.WriteLine(r))
Console.WriteLine("sync took {0}ms", syncSw.ElapsedMilliseconds)
let AsyncSubtract(x,y) = Async.FromBeginEnd(x, y, client.BeginSubtract, client.EndSubtract)
let asyncSw = Stopwatch.StartNew()
[1..MAX] |> Seq.map (fun i -> async {
let! r = AsyncSubtract(i,1)
Console.WriteLine(r)})
|> Async.Parallel |> Async.RunSynchronously |> ignore
Console.WriteLine("async took {0}ms", asyncSw.ElapsedMilliseconds)
#endif
Console.WriteLine("press a key to quit")
Console.ReadKey()