Как отменить потоковое вызов клиента GRPC в чистоте без запуска RPCexception, ObjectDisposedException или InvalidoperatiC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как отменить потоковое вызов клиента GRPC в чистоте без запуска RPCexception, ObjectDisposedException или Invalidoperati

Сообщение Anonymous »

Я работаю над клиентом GRPC, который непрерывно транслирует данные (например, изображения) с сервера. Я использую отмену, чтобы остановить поток, когда это необходимо. While cancellation works, I consistently see exceptions being thrown — even in what I believe are normal, graceful cancellation scenarios.
These include:
RpcException with StatusCode.Cancelled – expected and handled
But also (occasionally or consistently):
ObjectDisposedException
InvalidOperationException
RpcException with StatusCode.Unavailable < /p>
Я пытаюсь реализовать аннулирование таким образом, чтобы избежать этих не канцеляционных исключений, и задаюсь вопросом, есть ли лучшая шаблона или использование API для этого сценария. < /P>
Пример кода: < /p>
public static class ExceptionUtils
{
public static bool IsCancellation(Exception ex)
{
return ex is RpcException rpc && rpc.StatusCode == StatusCode.Cancelled;
}
}

void StartStream()
{
_cts = new CancellationTokenSource();
_streamTask = Task.Run(() =>
{
try
{
StreamLoop(_imageQueue, _cts.Token);
}
catch (Exception ex) when (ExceptionUtils.IsCancellation(ex))
{
_log.Info("Stream cancelled gracefully");
}
});
}

void StopStream()
{
_cts.Cancel();
_streamTask?.Wait();
_streamTask?.Dispose();
}

void StreamLoop(BlockingCollection queue, CancellationToken ct)
{
var stream = _grpcClient.StreamData(new Empty());`enter code here`
try
{
while (stream.ResponseStream.MoveNext(ct).Result)
{
var current = stream.ResponseStream.Current;
queue.Add(current);
}
}
finally
{
stream?.Dispose();
}
}
< /code>
Вопросы: < /p>
  • Как я могу отменить потоковую передачу клиента GRPC, например:
    только Rpcexception (Statuscode.cancelled) поднимается в большинстве - или в идеале не будет. Не получайте:
    objectDisposeException
    InvalidoperationException
    rpcexception(statuscode.unavailable)
    < /li>
    Является ли Dispose () потока в нужном месте? Это обеспечивает чистую отмену без запуска этих исключений времени выполнения?


Подробнее здесь: https://stackoverflow.com/questions/797 ... rpcexcepti
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • GCP — облачные задачи — Grpc.Core.RpcException
    Anonymous » » в форуме C#
    0 Ответы
    61 Просмотры
    Последнее сообщение Anonymous
  • Ошибка gRPC: io.grpc.StatusRuntimeException: ОТМЕНЕНО: io.grpc.Context был отменен без ошибки
    Гость » » в форуме JAVA
    0 Ответы
    114 Просмотры
    Последнее сообщение Гость
  • Потоковое клиентское приложение gRPC вызывает ошибку сегментации на нескольких клиентах потока
    Anonymous » » в форуме Linux
    0 Ответы
    70 Просмотры
    Последнее сообщение Anonymous
  • Как отменить сервер от клиента с помощью grpc в С#?
    Гость » » в форуме C#
    0 Ответы
    29 Просмотры
    Последнее сообщение Гость
  • Как выполнить модульное тестирование клиента gRPC, моделируя grpc.GrpcError в Python
    Anonymous » » в форуме Python
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»