gRP C C# на стороне сервера, ожидая, пока клиент не закроет соединение? - PullRequest
1 голос
/ 07 февраля 2020

Я создаю службу gRP C, которая позволяет клиентам публиковать c интерфейс

Мой протофиль:

syntax = "proto3";
package Tests;
import "google/protobuf/any.proto";
message ListenTest1EventStream {
    uint64 objectId = 1;
}
message EventTestEvent {
}
service Test1ObjectService {
    rpc ListenEvents (ListenTest1EventStream) returns (stream google.protobuf.Any);
}

Мой C# сервер:

ISomeService
{
    event EventHandler<EventArgs> TestEvent;
}

public class Server : Test1ObjectService.Test1ObjectServiceBase
{
    private readonly ISomeService _someService;

    public Server(ISomeService someService)
    {
        _someService = someService;
    }

    public override async Task ListenEvents(ListenTest1EventStream request, IServerStreamWriter<Any> responseStream, ServerCallContext context)
    {
        // Begin monitoring event handlers, wait indefinitely 
        var handler = new EventHandler<EventArgs>((sender, args) =>
        {
            responseStream.WriteAsync(Any.Pack(new EventTestEvent()));
        });
        _someService.TestEvent += handler;

        // TODO: Wait until response stream is forcibly closed. How?
        await responseStream.WaitForSatusChangedOrSomething();

        _someService.TestEvent -= handler;
    }
}

Как узнать, когда клиент отключается?

...