Files
HawkeyeVision/Hawkeye.VisionBuilder.Workflow/DataTransfer/CSharpDataTransferHTTP.cs
2025-08-28 16:30:29 +02:00

104 lines
2.9 KiB
C#

using static Community.CsharpSqlite.Sqlite3;
namespace Hawkeye.VisionBuilder.Workflow.DataTransfer;
public class CSharpDataTransferHTTP
{
private readonly PythonModelAPI _api;
private readonly HttpClient _client;
private readonly CancellationTokenSource _pingCts = new();
private readonly Thread _pingThread;
private readonly object _lock = new();
public CSharpDataTransferHTTP()
{
var handler = new SocketsHttpHandler
{
PooledConnectionIdleTimeout = TimeSpan.FromSeconds(10),
MaxConnectionsPerServer = 100
};
_client = new HttpClient(handler)
{
DefaultRequestHeaders =
{
ExpectContinue = false
}
};
_api = new PythonModelAPI("http://localhost:8000", _client);
_pingThread = new Thread(PingLoop) { IsBackground = true };
_pingThread.Start();
}
private void PingLoop()
{
while (!_pingCts.Token.IsCancellationRequested)
{
try
{
_client.GetAsync("http://localhost:8000/").Wait();
}
catch
{
// Ignore errors, optionally log
}
Thread.Sleep(3000); // Ping every 3 seconds
}
}
public void LoadModel(string path, string modelName)
{
lock (_lock)
{
_api.LoadModelAsync(new LoadModelIn()
{
Name = modelName,
Path = Path.GetFileName(path)
}).Wait();
}
}
public void ActivateModel(string modelName)
{
lock (_lock)
{
_api.ActivateModelAsync(new ActivateModelIn() { Name = modelName }).Wait();
}
}
public int[] GetAcceptSize()
{
var response = _api.GetAcceptSizeAsync().Result;
return response.Accept_size.ToArray();
}
public int[] GetOutputSize()
{
var response = _api.GetOutputSizeAsync().Result;
return response.Accept_size.ToArray();
}
public byte[] PredictRaw(byte[] byteArray)
{
var response = _api.PredictRawAsync(new FileParameter(new MemoryStream(byteArray))).Result;
var stream = response.Stream;
using var memoryStream = new MemoryStream();
stream.CopyTo(memoryStream);
memoryStream.Seek(0, SeekOrigin.Begin);
var responseBytes = memoryStream.ToArray();
return responseBytes;
}
public byte[] Predict(byte[] byteArray)
{
lock (_lock)
{
var response = _api.PredictAsync(new FileParameter(new MemoryStream(byteArray))).Result;
var stream = response.Stream;
using var memoryStream = new MemoryStream();
stream.CopyTo(memoryStream);
memoryStream.Seek(0, SeekOrigin.Begin);
var responseBytes = memoryStream.ToArray();
return responseBytes;
}
}
}