我在c#中使用grpc在服务器/客户端之间从两端推送消息。
一台服务器可以有多个客户端。
我这样处理服务器上的邮件:
public override async Task SyncStream(IAsyncStreamReader<SyncMessage> requestStream, IServerStreamWriter<SyncMessage> responseStream, ServerCallContext context)
{
while (await requestStream.MoveNext(CancellationToken.None))
{
var messageFromClient = requestStream.Current;
if (messageFromClient.AssociationMessage)
{
if (syncMessageClients.ContainsKey(messageFromClient.MachineId))
syncMessageClients.Remove(messageFromClient.MachineId);
syncMessageClients.Add(messageFromClient.MachineId, responseStream);
Console.WriteLine("Associated SYNC client with ID " + messageFromClient.MachineId);
}
else
{
ProcessMessage(messageFromClient, messageFromClient.MachineId);
}
}
}
我保留syncMessageClients
字典,其中包含用户ID和流。这样,当我要将消息从服务器推送到客户端时,我只需获取目标客户端ID,查找流并将其写入。
在客户端上,我通过以下方式处理发送消息:
private Queue<SyncMessage> syncQueue = new Queue<SyncMessage>();
bool syncWorking = false;
private async void SendMessage(SyncMessage message)
{
syncQueue.Enqueue(message);
if (!syncWorking)
{
syncWorking = true;
while (syncQueue.Any())
{
await syncStream.RequestStream.WriteAsync(syncQueue.Dequeue()); // Stuck here
}
syncWorking = false;
}
}
在尝试一次发送太多消息时,我遇到了问题,因为我最终尝试在仍然发送消息时编写更多消息。因此,只有当我们是目前唯一发送此消息的人时,它才会开始发送消息。
问题在于,这似乎卡在了以下注释行:await RequestStream.WriteAsync(...)
上。服务器上已收到该消息,但客户端永不移动。
为什么它卡在那里?我怎样才能解决这个问题?我需要客户端和服务器之间的通讯通道,可以从两端进行推送。