我正在尝试实现一个简单的 gRPC 服务,客户端可以将任务排队到服务器。 我决定测试多个调用,其中客户端发送多个请求,但任务计数停留在 1。为了调试更多,我添加了一个简单的计数器,每当调用该方法时该计数器都会增加。由于某种原因,这两个值都停留在 1,但它表明该方法已被调用多次。我是否误解了 gRPC 协议的工作原理?
客户端代码
public async Task SendTaskToSchedulerAsync()
{
using var channel = GrpcChannel.ForAddress(ClientData.schedulerAddress, new GrpcChannelOptions
{
HttpHandler = _handler
});
var client = new Scheduler.SchedulerClient(channel);
var task = new gRPCreq_Task { Type = TaskType.TtGeneratePassword, NLoops = 30, WorkTime = 20 };
try
{
for(int i = 0; i < 10; i++)
{
var response = await client.C_SendTaskAsync(task);
Console.WriteLine($"Server responded with: {response.TaskStatus}");
}
}
catch (Exception ex)
{
Console.WriteLine($"Error communicating with the server: {ex.Message}");
}
}
Server Code:
public override async Task<gRPCres_TaskStatus> C_SendTask(gRPCreq_Task request, ServerCallContext context)
{
_tasks.Enqueue(request);
counter++;
Console.WriteLine($"Queue size: {_tasks.Count}");
Console.WriteLine($"Counter {counter}");
return await Task.FromResult(new gRPCres_TaskStatus { TaskStatus = TaskStatus.TsTaskAccepted });
}
Server Output:
Queue size: 1
Counter 1
Queue size: 1
Counter 1
Queue size: 1
Counter 1
Queue size: 1
Counter 1
Queue size: 1
Counter 1
Queue size: 1
Counter 1
Queue size: 1
Counter 1
Queue size: 1
Counter 1
Queue size: 1
Counter 1
Queue size: 1
Counter 1
好吧,我设法在某个地方找到了答案。在 Program.cs 中我需要添加:
builder.Services.AddSingleton<MyService>();
我认为在添加该行之前,每个新调用都会创建一个新的服务实例。但我可能是错的。