Grpc发送已收到的消息,但“发送”方法永不结束

时间:2019-09-17 18:04:41

标签: c# .net-core grpc

我在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(...)上。服务器上已收到该消息,但客户端永不移动。

为什么它卡在那里?我怎样才能解决这个问题?我需要客户端和服务器之间的通讯通道,可以从两端进行推送。

0 个答案:

没有答案