aspnetcore/benchmarks/Crankier/WorkerReceiver.cs

79 lines
2.8 KiB
C#

// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http.Connections;
using Newtonsoft.Json;
namespace Microsoft.AspNetCore.SignalR.Crankier
{
public class WorkerReceiver
{
private readonly StreamReader _reader;
private readonly IWorker _worker;
private CancellationTokenSource _receiveMessageCts;
public WorkerReceiver(StreamReader reader, IWorker worker)
{
_reader = reader;
_worker = worker;
}
public void Start()
{
if (_receiveMessageCts != null)
{
_receiveMessageCts.Cancel();
}
_receiveMessageCts = new CancellationTokenSource();
Task.Run(async () =>
{
while (!_receiveMessageCts.Token.IsCancellationRequested)
{
var messageString = await _reader.ReadLineAsync();
try
{
var message = JsonConvert.DeserializeObject<Message>(messageString);
switch (message.Command.ToLowerInvariant())
{
case "ping":
await _worker.PingAsync(
message.Value["Value"].ToObject<int>());
break;
case "connect":
await _worker.ConnectAsync(
message.Value["TargetAddress"].ToObject<string>(),
message.Value["TransportType"].ToObject<HttpTransportType>(),
message.Value["NumberOfConnections"].ToObject<int>());
break;
case "starttest":
await _worker.StartTestAsync(
TimeSpan.FromMilliseconds(message.Value.Value<double>("SendInterval")),
message.Value["SendBytes"].ToObject<int>());
break;
case "stop":
await _worker.StopAsync();
break;
}
}
catch (Exception ex)
{
Trace.WriteLine(ex.Message);
}
}
});
}
public void Stop()
{
_receiveMessageCts.Cancel();
}
}
}